이 article은 잠금 경합을 줄이는 아이디어 인 "Double-Checked Locking"에 대해 설명합니다. 기사에서 설명하는대로 작동하지 않습니다. "(여전히) 깨진 다중 스레드 버전"이중 확인 잠금 "관용구"표의 코드 샘플을 참조하십시오.이 이중 확인 잠금 장치가 손상되지 않았습니까?
이제는 작동해야하는 변형을 발견했다고 생각합니다. 문제는 그것이 올바른지 여부입니다. 공유 대기열을 통해 데이터를 교환하는 소비자와 생산자가 있다고 가정 해 보겠습니다.
class Producer {
private Queue queue = ...;
private AtomicInteger updateCount;
public void add(Data data) {
synchronized(updateCount) {
queue.add(task);
updateCount.incrementAndGet();
}
}
}
class Consumer {
private AtomicInteger updateCount = new AtomicInteger(0);
private int updateCountSnapshot = updateCount.get();
public void run() {
while(true) {
// do something
if(updateCountSnapshot != updateCount.get()) {
// synchronizing on the same updateCount
// instance the Producer has
synchronized(updateCount) {
Data data = queue.poll()
// mess with data
updateCountSnapshot = updateCount.get();
}
}
}
}
}
질문은이 접근 방식이 효과가 있다고 생각하는지 여부입니다. 나는 많은 사람들이 깨지기 때문에 깨지기 때문에 확신하고 싶습니다 ... 그 생각은 updateCount가 변경되면 소비자에게 동기화 된 블록을 입력 할 때 잠금 경합을 줄이는 것입니다.
왜 휠을 다시 발명하려고하십니까? 생성자와 소비자 사이의 의사 소통을위한 잘 알려진 thread-safe 구조가 있는데 그것은 BlockingQueue입니다. – OldCurmudgeon
왜냐하면 소비자를 실행하는 스레드는 블로킹을 할 때 할 수없는 다른 작업을 수행하기 때문에 바쁘기 때문입니다 갖다. 주기적으로 poll()을 호출하는 것은 너무 똑똑하지도 않습니다 (또한 폴링은 일부 CPU주기를 먹습니다). – OlliP
그런 다음 동시성 문제가 아닌 아키텍처 문제가 있습니다. 'poll '을 주기적으로 호출하는 데는 아무런 문제가 없습니다. 여러분은 조기에 최적화 할 수 있습니다. – OldCurmudgeon