# reference : 7가지 동시성 모델

# 리스너 처리시 lock idiom
listener 순회시 deadlock 방지, lock 구간 감소.
but 실제로는 그냥 CopyOnWriteArrayList 를 사용하라.

private void updateProgress(int n) {
 ArrayList<ProgressListener> listenersCopy;
 synchronized(this) {
 listenersCopy = (ArrayList<ProgressListener>)listeners.clone();
 }
 for (ProgressListener listener : listenersCopy) listener.onProgress(n);
}

# ReenterantLock
기본적으로 monitor lock 과 동일한 사용법. (ex> await 사용 방법)
tryLock
lockInteruptibly
await :

ReenterantLock lock = new ReenterantLock()
Condition condition = lock.newCondition()
lock.lock();
try {
 while (!<<조건이 참>>) condition.await();
 <<공유 자원 이용>>
} finally { lock.unlock(); }

# Poison pill
생산자-소비자 패턴에서 소비자를 멈추게 하기 위해 특별한 값 (poison pill) 을 전달.

# ConcurrentHashMap 은 동기화를 지원하지만, 복합 연산으로 사용할때는 추가적인 lock이 필요하다. 아니면 아래 같은 idiom 도 가능

void countWord(Stiring word) {
 while(true) {
 Integer currentCnt = counts.get(word);
 if (currentCnt == null) { if (counts.putIfAbsent(word,1) == null) break;
 } else if (counts.replace(word, currentCnt, currentCnt +1) {break;}
 }
}