watit와 notify를 정확하게 사용하는 것이 어렵기 때문에 자바 1.5 플랫폼에서 지원하는 고수준 병행성 유틸리티를 반드시 이용해야 한다. java.util.concurrent에 포함된 이 유틸리티들은 실행자 프레임워크, 병행 컬렉션, 그리고 동기자의 세 가지 범주로 나눌 수 있다.

  • 병행 컬렉션은 List, Queue, Map 등의 표준 컬렉션 인터페이스에 대한 고성능 병행 컬렉션 구현을 제공한다. 이 컬렉션들은 병행성을 높이기 위해 동기화를 내부적으로 처리한다. 따라서 컬렉션 외부에서 병행성을 처리하는 것은 불가능하다. 락을 걸어봐야 효과가 없을뿐만 아니라 프로그램만 느려진다. 병행컬렉션에는 예를들어, ConcurrentMap이란 것이 있는데 Map을 확장해서 몇 가지 메서드를 추가하였다. 그 가운데 putIfAnsent(key,value) 메소드는 는 키에 해당하는 값이 없을떄만 주어진 값을 넣고, 이미 있는 경우는 기존 값을 반환한다. 없는 경우에는 null을 반환하기 때문에 반환되는 값을 체크하여 사용하면 효율적이다.
  • 동기자는 스레드들이 서로를 기다릴 수 있도록 하여, 상호 협력이 가능하게 한다. 

카운트라운 래치는 일회성 배리어로서 하나 이상의 스레드가 작업을 마칠 때까지 다른 여러 스레드가 대기할 수 있도록 한다. 또한 특정구간의 실행시간을 잴 때는 System.currentTimeMillis 대신 System.nanoTime을 사용해야 한다. 그래야 시스템의 실시간 클락 변동에도 영향을 받지 않으며, 더 정밀하다

요약

새로 만드는 프로그램에 wait나 notify를 사용할 이유는 거의없다. wait나 notify를 이용하는 기존 코드를 유지보수해야 한다면, while문 안에서 wait를 호출하는 표준 숙어를 따라야 한다.

그리고 실무에서는 일반적으로 notify 대신 notifyAll을 이용하도록 해야 한다.



+ Recent posts