아이템 81. wait 과 notify 보다는 동시성 유틸리티를 이용하라. #193
Unanswered
Irisation23
asked this question in
3. 과제
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
Table of contents generated with markdown-toc
0. TL;DR 📚
고수준 동시성 유틸리티
를 사용하자.1. wait 과 notify
해당 키워드들은 스레드의 상태 제어를 위한 메서드이다.
고수준 동시성 유틸리티
를 이용한다.2. 고수준 동시성 유틸리티
고수준 동시성 유틸리티는 3종류로 나눌 수 있다.
2.1 실행자 프레임워크
아이템 80. 에서 다뤄지는 내용을 참조.
2.2 동시성 컬렉션
표준 컬렉션(
List
,Queue
,Map
) + 동시성 = 동시성 컬렉션( CopyOnWriteArrayList , ConcurrentHashMap, ConcurrentLinkedQueue)참조 자료 자바독동시성 컬렉션의 동시성을 무력화하는 것은 불가능하며, 외부에서 락을 걸어오면 속도가 느려진다.
동시성을 무력화하지 못하므로 여러 메서드를 원자적으로 묶어 호출할 수 없다.
상태 의존적 메서드
위의 문제를 해결하기 위해 여러 기본 동작들을 하나로 묶는
상태 의존적 메서드
를 이용할 수 있다.Collections.synchroizedXXX
Collections에서 제공해주는
synchronizedXXX()
를 사용하여 동기화한 컬렉션을 만드는 것 보다는 동시성 컬렉션을 사용하는 것이 성능적 이점을 볼 수 있다.3. 동기화 장치
컬렉션 인터페이스 중 일부는 작업이 성공적으로 완료될 때 까지 기다리도록 확장되었다.
BlockingQueue
BlockingQueue의 take() 는 큐의 원소를 꺼내는 역할을 하는데, 만약 큐가 비어있다면 새로운 원소가 추가될 때까지 기다린다.
ThreadPoolExcutor를 포함한 대부분의 실행자 서비스 (아이템 80.) BlocingQueue를 사용한다.
동기화 장치의 종류
executor는 concurrency 매개변수로 지정한 값(위 코드에서는 3)만큼의 스레드를 생성할 수 있어야 한다. 그렇지 않으면 메서드 수행이 끝나지 않는데 이를 스레드 기아 교착 상태라고 한다.
3. wait와 notify 메서드를 사용해야하는 상황은?
두가지 조건을 지켜 사용해야한다.
3.1 wait()
반드시 반복문 밖에서는 절대 호출하면 안된다. 또한 대기 전에 조건을 검사하여 조건이 이미 충족되었다면 wait을 피해야 하는데, 이는 응답 불가 상태를 예방하기 위해서이다.
한편, 대기한 이후의 조건을 검사하여 조건을 충족하지 않았을 때 다시 대기하게 하는 경우도 있는데, 이는 조건이 만족되지 않아도 스레드가 깨어날 수 있는 상황이 있기 때문이다. (안전 실패 예방)
3.2 notify()
일반적으로 notify()보다는 notifyAll()을 사용하는 것이 안전하다.
4. 핵심 정리 📚
5. 회고 🧹
2023-04-02 일
Java2
이라 생각한다.체화
를 통해 해당 기술이 어떤 인과관계를 가지고 있으며 내가 부딪힌 상황에서 고려해야할 점에 대해 파악해야 한다 생각한다.Beta Was this translation helpful? Give feedback.
All reactions