[독서] 2. 단례 모델

8437 단어
특징:
1. 구조 함수는 외부에 두지 않으며 일반적으로private이다
2. 공개된 정적 방법을 폭로하거나 매거진을 통해 하나의 단일 대상을 되돌려줍니다
3. 다중 스레드 환경에서 단일 클래스 대상이 있고 하나만 있는지 확보
4. 단일 클래스의 대상이 다시 반서열화될 때 대상을 재구성하지 않도록 확보한다
 
게으름뱅이 모드:
 1 public class Singleton{
 2     private static Singleton instance;
 3     //1.         
 4     private Singleton{
 5     }
 6     //2.                
 7     //3.  synchronized,         ,              synchronized          。
 8     //   getInstance       ,          
 9     public static synchronized Singleton getInstance(){
10         if(instance == null){
11             instance = new Singleton();
12         }
13         return instance;
14     }
15     
16 }

 
장점: 필요할 때 실례화, 자원 절약
단점: getInstance () 를 호출할 때마다 동기화해야 하기 때문에 불필요한 동기화 비용이 발생합니다
 
Double checkLock 구현 예:
 1 public class Singleton{
 2     private volatile static Singleton singleton;
 3     private Singleton (){}
 4     public static Singleton getInstance() {
 5         //                
 6         //
 7         if (singleton == null) {
 8             synchronized (Singleton.class) {
 9                 if (singleton == null) {
10                     //         null        
11                     singleton = new Singleton();
12                 }
13             }
14         }
15         return singleton;
16     }
17 }

DCL에 문제가 있습니다.
singleton = new Singleton();

이 구절은 원자 조작이 아니라 세 가지를 나눌 수 있다.
(1).Singleton의 인스턴스에 메모리 할당
(2).Singleton의 구조 함수를 호출하여 객체를 만듭니다.
(3).singleton의 대상을 메모리에 분배된 공간으로 가리키다
그러나 JDK1과 Java 컴파일러는 프로세서의 순서를 어지럽히는 것을 허용하기 때문에5 이전 JVM에서 Cache, 레지스터 및 메인 메모리 리셋 순서에 대한 규정은 (2)와(3)의 순서가 고정되어 있지 않으며,
그래서 실행 순서가 123일 수도 있고 132일 수도 있어요.
만약 132라면, 이때 예를 들어 A 라인이 13까지 실행되고, 아직 2가 실행되지 않았으며, 이때 B 라인도 실행되고,singleton이 비어 있지 않은 것을 검사하고, 직접 사용하면 오류가 발생할 수 있습니다
만약 JDK 1이라면5 및 다음 릴리즈에 Volatile 키워드를 추가합니다.
private volatile static Singleton singleton;

이렇게 하면singleton 대상이 매번 메인 메모리에서 읽히는 것을 보장할 수 있다.
 
정적 내부 클래스 단일 예제 모드:
 1 public class Singleton{
 2     private Singleton{}
 3     public static Singleton getInstance(){
 4         return SingletonHolder.sInstance;
 5     }
 6     /*
 7          
 8     */
 9     private static class SingletonHolder{
10         private static final Singleton sInstance = new Singleton();
11     }
12 }

장점: getInstance를 처음 호출해야만 sInstance가 초기화되고, 첫 번째 호출 시 가상 기기가singletonHolder 클래스를 불러옵니다.
이렇게 하면 라인의 안전을 보장할 수 있고, 단일 사례의 대상이 유일하며, 단일 사례의 실례화를 지연시킬 수 있다
 
열거 예:
1 public enum SingletonEnum{
2     INSTANCE;
3 }

장점: 라인이 안전하고 유일하며 반서열화도 방지할 수 있다.
 
단일 인스턴스 객체의 고유한 손상:
1. 반사
2. 서열화와 반서열화
 http://www.hollischuang.com/archives/1144

좋은 웹페이지 즐겨찾기