java单例模式下面两种方法有什么区别?
方法一:
public class SingleTon {
private static SingleTon singleTon;
private SingleTon(){
}
public synchronized static SingleTon getSingleTon(){
if(singleTon == null){
singleTon = new SingleTon();
}
return singleTon;
}
}
方法二:
public class SingleTon {
private static SingleTon singleTon = new SingleTon();
private SingleTon(){
}
public synchronized static SingleTon getSingleTon(){
return singleTon;
}
}
请教一下这两种方法的区别是什么,哪个更好?
방법 1이 동시성을 사용하고 성능을 소비하기 때문에 방법 2가 더 좋습니다.
게으른 모드와 배고픈 모드를 쉽게 말하면 게으른 로딩입니다. 이런 것이 좋은지 아닌지는 말할 수 없으며 실제 장면에 따라 다릅니다.
방법 2는 동시성만 준비합니다. 즉, 동시 액세스 여부는 이 클래스의 사용자가 결정합니다.
이 두 가지 유형에는 각각 장점과 단점이 있습니다. 첫 번째 방법은 로드 속도가 빠르지만 싱글톤 개체를 얻는 속도가 느립니다. 왜냐하면 판단을 사용하고 런타임 중에 새 개체를 검색하는 경우 두 번째 방법은 클래스를 로드하는 속도는 느리지만 얻는 속도는 더 빠르기 때문입니다. 클래스가 로드될 때 정적 멤버가 초기화되기 때문에 객체에 대한 참조만 반환하고 새 객체를 포함하지 않으므로 두 번째 메서드를 동기화할 필요가 없습니다.
이것은 싱글톤 모드의 두 가지 설계 방식입니다. 둘 다 동시성 및 스레드 안전성 문제를 방지하기 위해 동기화를 사용하지만 첫 번째는 게으른 사람의 설계 방식이고 두 번째는 배고픈 사람의 설계 방식입니다. 프로그램 자체에 미치는 영향은 개체를 얻는 시점이 다르다는 점입니다
싱글턴 모드에는 실제로 5가지 방법이 있습니다.
지연 모드는 첫 번째 코드에 해당합니다. 장점은 로딩이 지연된다는 것입니다. 단점은 인스턴스를 얻을 때마다 잠금 동기화가 필요하므로 리소스가 낭비된다는 것입니다.
Hungry Man 모드는 두 번째 코드에 해당합니다. 장점은 스레드 안전성이지만 단점은 나오자마자 로드되어 리소스를 낭비한다는 것입니다.
이중 확인 잠금의 게으른 모드입니다.
정적 내부 클래스를 위한 지연 모드.
Effective Java에서는 싱글톤을 구현하기 위해 enum을 사용하는 것이 좋습니다.
둘의 차이점은 첫 번째 방법은 지연 로딩이라는 점입니다. 이 메서드가 호출되지 않으면 객체가 생성되지 않지만 후자는 사용 여부에 관계없이 클래스를 로드할 때 인스턴스를 생성합니다.
으아악가장 일반적인 지연 로딩 방법은 이렇습니다
이렇게 하면 시간이 절약되고 새 개체가 생성되지 않습니다.
또한 동시성 상황이 매우 높을 경우 휘발성을 사용하여 인스턴스를 수정할 수 있습니다.
------------귀하의 코드를 자세히 살펴보지 않아서 추가하겠습니다------ ----
getInstance 메소드에 동기화 잠금을 설정한 것으로 나타났습니다. 이는 완전히 불필요합니다. 이후 동기화는 완전히 시간 낭비입니다.