저는 디자인 패턴을 배우고 있으며 자바에서 중간 경험을 쌓았습니다. 나는 단일 디자인 패턴을 구현하려고하고있어 방법에 다음 코드를 가로 질러 온 :싱글 톤 디자인 패턴에서 동기화 (MyClass.class) {} 무엇을합니까?
public static Singleton getInstance(){
if(firstInstance == null){
if (firstThread){
firstThread = false;
Thread.currentThread();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(Singleton.class.getName()).log(Level.SEVERE, null, ex);
}
}
synchronized(Singleton.class){
if(firstInstance == null){
firstInstance = new Singleton();
}
}
}
return firstInstance;
}
내가 이해하는 방법이 어떻게 작동하는지,하지만 난이 코드의 하나 개의 특정 부분 질문이 있습니다 :
synchronized(Singleton.class){
if(firstInstance == null){
firstInstance = new Singleton();
}
}
나는 구현 스레드 안전을하게하고 코드의이 부분 동기화 할 수있는 동기화 된 블록의 힘이 모든 방법을 진정되지 않는 것을 알지만, 왜 우리는 전에 괄호 안의 Singleton.class
포장된다 액세스 한정자 synchronized
?
제 질문은 디자인 패턴과 관련된 것보다 Java 관련입니다. Google과 StackOverflow를 검색해 보았지만이 결과가 실제로 무엇으로 제한되는지는 잘 모르겠습니다.
여러분이 도와 주시면 감사하겠습니다.
미리 감사드립니다.
[이중 확인 잠금] (https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java)이라고합니다. – Radiodef
Google에서 이중 잠금을 사용했습니다. 즉, 동기화 된 코드 만 잠글 수 있으며 다른 액세스 수정 자에 동일한 아이디어를 적용 할 수 있습니까?예 : private (this) {/ * private code here * /} 코드 블록을 메소드 내에서 private으로 처리 할 수 있습니까? – holasoyeddy
아니요, 'synchronized'는 여러 스레드가 동일한 블록을 동시에 실행하지 못하도록하는 키워드입니다. 이중 검사 잠금에서는 단일 인스턴스가 한 번만 생성되도록합니다. 인스턴스가 생성 된 후 잠시 후에 스레드는 첫 번째 널 (null) 검사에서 인스턴스를 보게되고'synchronized' 블록을 입력 할 필요가 없기 때문에 이중 검사됩니다. 이 자료에 대해 배우고 싶다면 튜토리얼을 추천합니다. https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – Radiodef