- 동기화 클래스 구현
- AbstractQueuedSynchronizer (AQS)
- AQS 사용 방식
- 상속을 통한 구현 방법은 권장하지 않음
- why → AQS에 정의돼 있지만 사용하지 않는 메서드가 public 으로 노출돼 있어 잘못 사용할 위험이 존재
- java.util.concurrent 패키지의 동기화 클래스 가운데 AQS를 직접 상속받는 클래스는 존재하지 않음
- private인 내부 클래스로 선언해 위임(delegate) 기법을 사용
- AQS 기반 구현 클래스
- ReentrantLock, Semaphore, ReentrantReadWriteLock, CountDownLatch, SynchronousQueue, FutureTask 등
- notifyAll이 호출되면 스레드가 꺠어나서 뭘 어떻게 경쟁을 한다는걸까
- 컨텍스트 스위칭
- 경쟁(OS 스케줄링 수준에서 경쟁이 아닐까?)
- 단일 연산 변수와 넌블로킹 동기화
- 넌블로킹 알고리즘
- 여러 스레드가 동일한 자료를 놓고 경쟁하는 과정에서 대기 상태에 들어가는 일이 없기 때문에 스케줄링 부하를 줄여줌
- 자바 5.0부터는 AtomicInteger나 AtomicReference 등의 단일 연산 변수를 사용해 넌블로킹 알고리즘을 효율적으로 구현할수 있게 됨
- 단일 연산 변수(atomic variable)
- volatile 변수에서 읽고-변경하고-쓰는 것과 같은 조건부 단일 연산을 지원하도록 일반화한 구조
- 사용시 주의할점
- hashCode(), equals() 메서드를 재정의하고 있지 않아 모든 인스턴스가 서로 다름
- 해시 값을 기반으로 하는 컬렉션 클래스의 키 값으로 사용하기에는 적절하지 않음
- 넌블로킹 동기화
단일 연산 클래스(AtomicXXX) vs Lock
- 경쟁 조건
- 많을때 → Lock
- 덜 치열할때 → AtomicInteger
- CAS Algorithm (동건님 공유 링크 링크)
Lock, 단일 연산 클래스 사용 사례에 대해