CountDownLatch: 하나 이상의 스레드가 다른 스레드에서 수행 중인 일련의 작업이 완료될 때까지 기다릴 수 있도록 하는 동기화 보조 장치입니다.
CyclicBarrier: 스레드 집합이 모두 각 작업을 기다리도록 하는 동기화 보조 장치입니다.
위는 Oracle의 공식 정의입니다. 간단히 말해서
CountDownLatch: 하나 이상의 스레드가 다른 스레드에서 수행된 일련의 작업이 완료될 때까지 기다릴 수 있도록 하는 카운터입니다.
CyclicBarrier: 순환 장벽을 사용하면 스레드 그룹이 서로 공통 장벽 지점에 도달할 때까지 기다릴 수 있습니다.
Difference
CountDownLatch는 AQS(AbstractQueuedSynchronizer)의 구성원이지만 CyclicBarrier는 그렇지 않습니다.
CountDownLatch의 사용 시나리오에는 두 가지 유형의 스레드가 있습니다. 하나는 wait() 메서드를 호출하는 대기 스레드이고 다른 하나는 countDownl() 메서드를 호출하는 작동 스레드입니다. CyclicBarrier의 맥락에서 모든 스레드는 서로를 기다리는 스레드이며 동일한 유형입니다.
CountDownLatch는 감소 후 재설정할 수 없는 다운 카운트입니다. CyclicBarrier는 증가 후 자동으로 재설정되는 업 카운트입니다.
두 개의 스레드 그룹을 생성하고 한 그룹은 다른 그룹을 기다립니다. 계속하기 전에 그룹 실행을 완료하세요
CountDownLatch countDownLatch = new CountDownLatch(5); ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { executorService.execute(() -> { countDownLatch.countDown(); System.out.println("run.."); }); } for (int i = 0; i < 3; i++) { //我们要等上面执行完成才继续 executorService.execute(() -> { try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("await.."); }); } executorService.shutdown();
Print:
run..
run..
run..
run..
run..
await..
await..
await..
Wait for 누적 스레드가 실행을 마친 후 메인 스레드가 누적 결과를 출력합니다
public class ThreadUnsafeExample { private int cnt = 0; public void add() { cnt++; } public int get() { return cnt; } public static void main(String[] args) throws InterruptedException { final int threadSize = 1000; ThreadUnsafeExample example = new ThreadUnsafeExample(); final CountDownLatch countDownLatch = new CountDownLatch(threadSize); ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < threadSize; i++) { executorService.execute(() -> { example.add(); countDownLatch.countDown(); }); } countDownLatch.await(); executorService.shutdown(); System.out.println(example.get()); } }
Print:
997
3 동시성 시뮬레이션
ExecutorService executorService = Executors.newCachedThreadPool(); CountDownLatch countDownLatch = new CountDownLatch(1); for (int i = 0; i < 5; i++) { executorService.submit( () -> { try { countDownLatch.await(); System.out.println("【" + Thread.currentThread().getName() + "】开始执行……"); } catch (InterruptedException e) { e.printStackTrace(); } }); } Thread.sleep(2000); countDownLatch.countDown();//开始并发 executorService.shutdown();
Print:
CyclicBarrier 예제모든 스레드는 실행을 계속하기 전에 특정 단계가 완료될 때까지 서로를 기다립니다.【pool-2-thread-2】실행 시작&hellip ;…
【pool-2-thread-5 】실행 시작...
【pool-2-thread-3】실행 시작...
【pool-2-thread-1】실행 시작... 실행. ..
final int totalThread = 3; CyclicBarrier cyclicBarrier = new CyclicBarrier(3); ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < totalThread; i++) { executorService.execute(() -> { System.out.println("before.."); try { cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } System.out.println("after.."); }); } executorService.shutdown();
before..before..
before..
after..
after . .
이후..
위 내용은 Java CountDownLatch 카운터 및 CyclicBarrier 사이클 장벽을 정의하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!