> Java > java지도 시간 > 항목 대기 및 알림을 위해 동시성 유틸리티를 선호합니다.

항목 대기 및 알림을 위해 동시성 유틸리티를 선호합니다.

DDD
풀어 주다: 2025-01-03 21:06:40
원래의
1031명이 탐색했습니다.

동기부여

  • Java 5부터 플랫폼은 java.util.concurrent 패키지에서 높은 수준의 동시성 유틸리티를 제공했습니다.
  • 대기 및 알림의 수동적이고 복잡한 사용을 대체합니다.
  • 더 안전하고 사용하기 쉬우므로 동시 코드에서 오류가 발생할 가능성이 줄어듭니다.

java.util.concurrent의 동시성 유틸리티
유틸리티 카테고리:

  • Executor Framework: 항목 80에서 다루는 스레드 관리
  • 동시 컬렉션: 목록, 대기열, 맵과 같은 표준 컬렉션을 스레드로부터 안전하게 구현합니다.
  • 동기화 장치: CountDownLatch, Semaphore, CyclicBarrier, Exchanger 및 Phaser를 포함한 스레드 간 조정

경쟁 컬렉션

특징:

  • 고성능을 위해 내부 동기화
  • 경쟁 활동의 배제를 허용하지 않습니다.
  • putIfAbsent와 같은 원자적 연산은 보안과 유용성을 향상시킵니다. 예: 스레드로부터 안전한 맵 구현:
Map<String, String> map = new ConcurrentHashMap<>();
String result = map.putIfAbsent("key", "value");
if (result == null) {
    System.out.println("Valor inserido.");
} else {
    System.out.println("Chave já existente com valor: " + result);
}

로그인 후 복사

혜택:

  • 동기화된 컬렉션을 교체합니다(Collections.synchronizedMap).
  • 경쟁 애플리케이션의 성능이 크게 향상되었습니다.

동기화기
용도: 스레드 간의 조정.

일반적인 동기화 장치의 예:

  • CountDownLatch: 스레드 조정을 위한 일회용 장벽.
  • 세마포어: 공유 리소스에 대한 액세스를 제어합니다.
  • CyclicBarrier: 재사용 가능한 장벽 지점에서 동기화
  • Phaser: 고급 및 동적 스레드 동기화.

실제 예: CountDownLatch를 사용한 동시 타이밍
목표: 여러 스레드의 실행 시간을 동시에 측정합니다.

구현:

public static long time(Executor executor, int concurrency, Runnable action) throws InterruptedException {
    CountDownLatch ready = new CountDownLatch(concurrency);
    CountDownLatch start = new CountDownLatch(1);
    CountDownLatch done = new CountDownLatch(concurrency);

    for (int i = 0; i < concurrency; i++) {
        executor.execute(() -> {
            try {
                ready.countDown(); // Indica que está pronto
                start.await();     // Aguarda o sinal de início
                action.run();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                done.countDown(); // Indica que terminou
            }
        });
    }

    ready.await();   // Aguarda todas as threads ficarem prontas
    long startTime = System.nanoTime();
    start.countDown(); // Dispara o sinal de início
    done.await();     // Aguarda todas as threads finalizarem
    return System.nanoTime() - startTime;
}

로그인 후 복사

참고:

  • 3개의 래치를 사용합니다: 준비(준비 상태 표시), 시작(초기 트리거), 완료(종료).
  • System.nanoTime을 사용하여 시간 간격을 정확하게 측정합니다.

기다리고 알리는 현재 연습
레거시 코드 유지 관리에만 필요합니다.
주요 규칙:

  1. 대기를 호출할 때는 항상 루프를 사용하세요.
synchronized (lock) {
    while (!condition) {
        lock.wait();
    }
}

로그인 후 복사
  1. 기다리기 전과 후의 상태를 테스트해보세요.
  2. notify에 대한 의존성을 피하고,notifyAll을 선호하세요.

결론

  • 가능하면 경쟁력 있는 유틸리티를 사용하세요.
  • 코드를 더 읽기 쉽고 안전하며 효율적으로 만듭니다.
  • CyclicBarrier 또는 Phaser와 같은 최신 대안은 대기 및 알림 기반 패턴을 대체할 수 있습니다

책의 예시

Item  Prefira os utilitários de concorrência ao wait e notify

Item  Prefira os utilitários de concorrência ao wait e notify

Item  Prefira os utilitários de concorrência ao wait e notify

Item  Prefira os utilitários de concorrência ao wait e notify

위 내용은 항목 대기 및 알림을 위해 동시성 유틸리티를 선호합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿