첫 번째 (게으른 사람, 실은 안전하지 않음) :
Public Class Singleton {private static singleton 인스턴스 () {} public static singleton getinstance (instance == null) {instance = reton ()}}.
이러한 글쓰기 방식은 분명하지만 치명적은 다중 스레드에서 정상적으로 작동 할 수 없다는 것입니다.
두 번째 유형 (게으른 사람, 실 안전) :
Public Class Singleton {private static singlet instance () {} public static synchronized singletonstance (instance == null) {inst.
이러한 글쓰기 방식은 멀티 스레드에서 잘 작동 할 수 있으며, 또한 게으른 하중이 좋지만 불행히도 99%가 동기화 될 필요는 없습니다.
셋째 (배고픈 사람) :
공개 클래스 싱글 턴 {private static singlet instance = new Singlet () {} public static singleton getInstance () {return instance;}}}
이 방법은 다중 스레드 동기화 문제를 피하기위한 클래스 리더 메커니즘을 기반으로합니다. 로딩.
네 번째 유형 (배고픈 사람, 변형) :
Public Class Singleton {private singlet instance = null;
표면적으로는 매우 다르게 보입니다. 세 번째 방법은 비슷합니다.
다섯 번째 (정적 내부 클래스) :
공개 클래스 싱글 톤 {private static 클래스 단일 레터 {private static final singlet instance = new Singleton ();} private singlet () {} public static l singleton getinstance () {return singletonholder.instance;}}
이 방법은 또한 클래스 리더의 메커니즘을 사용하여 초기화 된 인스턴스가 세 번째 및 네 번째 방법과 다릅니다 (매우 작은 차이). 로드되면 인스턴스가 인스턴스화되며 (게으른 하중 효과를 달성하지 못함),이 방법은 싱글 톤 클래스가로드되고 인스턴스가 초기화되지 않을 수 있습니다. 싱글 톤 홀더 클래스는 적극적으로 사용되지 않기 때문에 getInstance 메소드를 호출하여 즉시 인스턴스 인스턴스 인스턴스 인스턴스 인스턴스 인스턴스 인스턴스 인스턴스 인스턴스 인스턴스로 표시 될 때만 싱글 톤 홀더 클래스 만 표시됩니다. 제도화 된 인스턴스가 자원을 소비한다면, 다른 곳에서 싱글 톤 클래스를 적극적으로 사용할 수 없기 때문에 로딩을 지연시키고 싶지 않다고 상상해보십시오. 결과적으로 사용하기 위해 사용하려면 인스턴스화 된 인스턴스가 부적절합니다. 현재이 방법은 세 번째 및 네 번째 방법에 비해 매우 합리적입니다.
여섯 번째 유형 (열거) :
공개 열거 싱글 톤 {인스턴스;
이 방법은 효과적인 Java 작가 Josh Block입니다.
일곱 번째 (더블 스쿨 잠금) :
공개 클래스 싱글 톤 {개인 휘발성 정적 싱글 톤 싱글 턴 () 개인 싱글 톤 () {} public static singletonleton () {if (singlen == null) izlet (singleton.class) {if (singleton == null) {Singleton = new Singleton () ;}}} 반환 싱글 톤;}}
일반적으로 이중 검사 잠금으로 알려진 두 번째 방법의 업그레이드 된 버전입니다. http://www.ibm.com/developerworks/cn/java/j-dcl.html
JDK1.5 후, 이중 검사 잠금은 정상적으로 단수 효과를 달성 할 수 있습니다.
요약
주의를 기울여야 할 두 가지 질문이 있습니다.
1. 단일 케이스가 다른 유형의 로더로로드되면 여러 개의 단일 사례 인스턴스가있을 수 있습니다. 예를 들어, 일부 서블릿 컨테이너는 각 서블릿에 대해 완전히 다른 유형의 로더를 사용한다고 가정합니다.
2. 싱글 톤이 java.io.serializable 인터페이스를 구현하면이 클래스의 인스턴스가 직렬화되어 복원 될 수 있습니다. 어쨌든 싱글 클래스의 객체를 직렬화 한 다음 여러 객체를 복원하면 단일 사례 클래스의 여러 예제가 있습니다.
첫 번째 질문을 수리하는 방법은 다음과 같습니다.
개인 정적 클래스 getClass (String ClassName)
ClassNotFoundException {
클래스 로더 클래스 로더 = thread.currentThread ();
if (classLoader == null)
ClassLoader = Singleton.class.getClassLoader ();
return (classLoader.LoadClass (className));
}
}
두 번째 질문을 수리하는 방법은입니다
공개 클래스 싱글 턴은 java.io.serializable을 구현합니다.
공개 정적 싱글 톤 인스턴스 = 새로운 싱글 톤 ();
보호 된 싱글 톤 () {
}
개인 객체 readResolve () {
반환 인스턴스;
}
}
저에게는 단순하고 이해하기 쉬운 세 번째와 다섯 번째 방법을 선호하고 JVM 레이어에서 스레드 안전을 실현합니다 (일반적으로 다중 클래스 로더 환경이 아니라면 세 번째 방법을 사용합니다. 게으른 로딩 효과가 명확하게 달성 될 때만 다섯 번째 방법을 사용하십시오 첫 번째 및 두 번째 방법을 사용하지 않으면 일곱 번째 방법이 있습니다.
=================================================== ===============
Superheizai 급우들은 매우 잘 요약되었습니다.
그러나 일반적으로 첫 번째 예는 단일 예제가 아니며, 네 번째 및 세 번째 유형은 계산되면 다섯 번째 유형도 별도로 작성할 수 있습니다. 따라서 일반 싱글은 5 가지 방법입니다. 게으른 남자, 사악한 남자, 이중 학교 자물쇠, 열거 및 정적 내부 수업.
나는 그런 독자를 갖고 함께 격려하게되어 매우 기쁩니다.