watit와 notify를 정확하게 사용하는 것이 어렵기 때문에 자바 1.5 플랫폼에서 지원하는 고수준 병행성 유틸리티를 반드시 이용해야 한다. java.util.concurrent에 포함된 이 유틸리티들은 실행자 프레임워크, 병행 컬렉션, 그리고 동기자의 세 가지 범주로 나눌 수 있다.
- 병행 컬렉션은 List, Queue, Map 등의 표준 컬렉션 인터페이스에 대한 고성능 병행 컬렉션 구현을 제공한다. 이 컬렉션들은 병행성을 높이기 위해 동기화를 내부적으로 처리한다. 따라서 컬렉션 외부에서 병행성을 처리하는 것은 불가능하다. 락을 걸어봐야 효과가 없을뿐만 아니라 프로그램만 느려진다. 병행컬렉션에는 예를들어, ConcurrentMap이란 것이 있는데 Map을 확장해서 몇 가지 메서드를 추가하였다. 그 가운데 putIfAnsent(key,value) 메소드는 는 키에 해당하는 값이 없을떄만 주어진 값을 넣고, 이미 있는 경우는 기존 값을 반환한다. 없는 경우에는 null을 반환하기 때문에 반환되는 값을 체크하여 사용하면 효율적이다.
- 동기자는 스레드들이 서로를 기다릴 수 있도록 하여, 상호 협력이 가능하게 한다.
카운트라운 래치는 일회성 배리어로서 하나 이상의 스레드가 작업을 마칠 때까지 다른 여러 스레드가 대기할 수 있도록 한다. 또한 특정구간의 실행시간을 잴 때는 System.currentTimeMillis 대신 System.nanoTime을 사용해야 한다. 그래야 시스템의 실시간 클락 변동에도 영향을 받지 않으며, 더 정밀하다
요약
그리고 실무에서는 일반적으로 notify 대신 notifyAll을 이용하도록 해야 한다.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[병행성]규칙71. 초기화 지연은 신중하게 하라 (0) | 2017.05.08 |
---|---|
[병행성]규칙70. 스레드 안전성에 대해 문서로 남겨라 (0) | 2017.05.08 |
[병행성]규칙68. 스레드보다는 실행자와 태스크를 이용하라 (0) | 2017.05.08 |
[병행성]규칙67.과도한 동기화는 피하라. (0) | 2017.05.08 |
[병행성]규칙66. 변경 가능 공유 데이터에 대한 접근은 동기화하라 (0) | 2017.05.07 |