동기화된 키워드를 사용하면 스레드 안전성과 공유 리소스에 대한 동기 액세스를 보장하기 위해 뮤텍스가 사용됩니다. 복잡한 동시 작업을 완료하려면 스레드 간 추가 조정 실행이 필요한 경우가 많습니다. 예를 들어 대기/알림 모드는 다중 스레드 환경에서 조정된 실행 메커니즘입니다.
API(뮤텍스 사용)를 통해 잠금을 획득 및 해제하거나 대기/알림 및 기타 메서드를 호출하는 것은 모두 하위 수준 호출 메서드입니다. 또한 스레드 동기화를 위해서는 더 높은 수준의 추상화를 생성해야 합니다. 일반적으로 사용되는 동기화 보조 클래스는 둘 이상의 스레드 간의 동기화 활동 메커니즘을 추가로 캡슐화하는 것입니다. 내부 원칙은 기존 기본 API를 사용하여 스레드 간의 복잡한 조정을 달성하는 것입니다.
일반적인 동기화 시나리오에 적합한 5가지 동기화 도우미 클래스가 있습니다.
1. 세마포어 세마포어는 고전적인 동기화 도구입니다. 세마포어는 스레드가 동시에 액세스할 수 있는 리소스(물리적 또는 논리적) 수를 제한하는 데 자주 사용됩니다.
2.CountDownLatch는 매우 간단하지만 일반적으로 사용되는 동기화 보조 클래스입니다. 그 목적은 다른 스레드에서 수행되는 일련의 작업이 완료될 때까지 하나 이상의 스레드가 차단되도록 허용하는 것입니다.
3. CyclicBarrier는 특정 동시 프로그래밍 시나리오에 유용한 재설정 가능한 다중 방향 동기화 지점입니다. 이를 통해 스레드 그룹은 공통 장벽 지점에 도달할 때까지 서로를 기다릴 수 있습니다. CyclicBarrier는 때때로 서로를 기다려야 하는 고정 크기 스레드 집합이 포함된 프로그램에 유용합니다. 대기 중인 스레드가 해제된 후에 장벽을 재사용할 수 있으므로 순환 장벽이라고 합니다.
4. Phaser는 CyclicBarrier 및 CountDownLatch와 기능이 유사하지만 사용이 더 유연한 재사용 가능한 동기화 장벽입니다. 멀티스레드 환경에서 단계별 컴퓨팅 작업을 동기적으로 조정하는 데 매우 적합합니다(Fork/Join 프레임워크의 하위 작업 간에 동기화가 필요한 경우 Phaser가 선호됩니다).
5.Exchanger를 사용하면 두 스레드가 특정 회의 지점에서 개체를 교환할 수 있으며 이는 특정 파이프라인 설계에 더 유용합니다. Exchanger는 한 쌍의 스레드가 데이터를 교환할 수 있는 동기화 지점을 제공합니다. 각 스레드는 exchange() 메서드의 입력을 통해 파트너 스레드에 데이터를 제공하고, 파트너 스레드에서 제공한 데이터를 받아 반환합니다. 두 스레드가 Exchanger를 통해 개체를 교환하는 경우 두 스레드 모두에 대해 교환이 안전합니다. 교환기는 동기식 대기열의 양방향 형태로 간주될 수 있으며, 이는 유전자 알고리즘 및 파이프라인 설계와 관련된 응용 프로그램에 더 유용합니다.