Java에서 키워드 static
및 volatile
에 익숙해지기 시작했습니다. 내가 만들고있는 싱글 톤 클래스와 관련하여 왜 다음과 같은 디자인을 볼 수 있습니까?싱글 톤 인스턴스 인스턴스화
public class Singleton{
private static volatile Singleton _instance;
public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}
대신이 하나?
public class Singleton{
private static volatile Singleton _instance = new Singleton();
public static Singleton getInstance(){
return _instance;
}
}
첫 번째 디자인은 두 번째 디자인보다 이점이 있습니까? 내가 볼 수있는 유일한 장점은 두 번째 디자인이 전체 메서드를 동기화하므로 전체 메서드를 차단해야한다는 것입니다. 그러나 그 방법에 대한 나의 생각은이 방법이 단 한 줄에 지나지 않으므로 눈에 띄게 차단되지 않는다는 것입니다.
"눈에 띄게 차단되는"의미는 무엇입니까? 어셈블리 언어로 된 지시 시간에주의 할 수 없다고해서 실생활에서 중요하지 않다는 것을 의미하지는 않습니다. –
첫 번째 예제에서는 null _instance에 대한 두 가지 검사가 필요하지 않을 것이라고 확신합니다. 따라서 두 번째 검사는 제거 될 수 있습니다. 이 클래스에는 인스턴스가 new'd에서 null로 이동할 수있는 방법이 없습니다. –
@ user619818 두 번째 검사가 필요합니다. 이전 검사 이후 다른 스레드가 이미 인스턴스를 초기화했을 수 있기 때문입니다. –