그래서 나는 lockMap 누군가가이 DCL의 전형적인 사례라고 언급 코드 검토 중에 ConcurrentHashMap
더블 체크 잠금의 특별한 경우? 컴파일러는 이벤트를 재정렬 할 수 있기 때문에, 잠금이 가능성이 있기 때문
//Creation of locks
Lock getLock(String key) {
Lock lock = lockMap.get(key);
if (lock == null) {
synchronized (lockMap) {
lock = lockMap.get(key);
if (lock == null) {
lock = new ReentrantLock();
lockMap.put(key, lock);
}
}
}
return lock;
}
입니다이 코드를 지도에 삽입 될 때 아직 완전히 초기화되지 않은 경우 동일한 잠금을 요청하는 다음 스레드가 아직 완전히 초기화되지 않을 수 있습니다.
이제이 문제는이 문제가 멀티 스레드 응용 프로그램의 공통적 인 문제라는 것입니다.지도에서 무언가를 얻고 거기에 생성하고 추가하십시오.
- 이것은 실제로 DCL의 경우입니까?
- 그렇다면 어떻게 해결할 수 있습니까? 그래서 다시
- 하면 (우리가 사용하는 간단하고 바보 같은 방법은 잠금 풀을 만드는 것입니다 하나는 풀에서 추출 할 때 새가 삽입은)는 java8
어떤 이벤트를 재주문 하시겠습니까? –
왜 자물쇠를 두 번 쿼리합니까? 그리고 왜 지구상에 자물쇠가 있습니까? 모든 작업을 감각적으로 이해하기 위해서는 우선 사전에없는 자물쇠를 얻어야합니다. synchonized 메서드를 호출 한 다음 반환하기 전에 잠금을 잠급니다. – vidstige
DCL [정의상] (http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java)입니다. 그러나 @rolfl이 보여 주었 듯이, ConcurrentHashMap에'synchronize '할 필요는 없습니다. –