에 잠금 장치에 동기화 사용하는 잠금 퍼펙트 변환 (따라서 게으른) 그리고 그것은 한 번 이상 발생할 수 있습니다 (따라서 싱글 톤 패턴을 사용할 수 없습니다, 내가 틀렸다면 수정하십시오).는 JAVA 8에 <code>synchronized</code> 키워드를 사용하여 잠금 더블 체크를 구현하는 다음 코드를 고려 JAVA
어쨌든 먼저 synchronized 키워드를 사용하는 대신 JAVA 동시 패키지에서 Lock
을 사용하려면 위의 코드를 어떻게 변환합니까?
그 후에 선택적으로 Lock 또는 synchronized 키워드를 사용하는 것에 대해 자유롭게 의견을 말하십시오.
이 질문은 잠금 대 동기화 비교가 아니라는 점을 기억하십시오. 코드 변환 부분에 응답하지 않은 응답 시도는 허용 된 대답으로 선택되지 않습니다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HeavyInitializer {
static final Logger logger = LoggerFactory.getLogger(HeavyInitializer.class);
static HeavyInitializer singleton;
public static synchronized HeavyInitializer getInstance() {
if (singleton==null) {
singleton = new HeavyInitializer();
}
return singleton;
}
boolean initialized;
private HeavyInitializer() {
initialized = false;
}
public synchronized void initialize() {
if (!initialized) {
heavyStuffDoneHere();
}
}
public synchronized void reInitilize() {
if (needToReinitialise()) {
heavyStuffDoneHere();
}
}
private void heavyStuffDoneHere() {
initialized = true;
}
private boolean needToReinitialise() {
if (!initialized)
return false;
boolean ret = false;
//Do your check here... and set ret
return ret;
}
}
Oracle's doc에서 :
가능한 복제 (http://stackoverflow.com/questions/4201713/synchronization-vs-lock) 구현 확장 –
@ErwinBolwidt 예를 들어 비교에만 집중하고이 질문을 완전히 무시하면 주요 질문 인 동등한 코드 변환을 묻습니다. 당신이 원하지 않는 경우 비교에 대해 언급 할 필요는 없지만 코드 변환에 응답하십시오. – user1589188
싱글 톤을 사용할 수 있습니다. 하나의 가능한 아키텍처는 초기화 및 redo 초기화에 동기화 된 메서드를 사용하여 Singleton HeavyInitializer 클래스를 만드는 것입니다. – Chocksmith