단일 모드 → 파괴 → 파괴 저지

7895 단어
일례 상용 실현
  • 게으름뱅이
  • 굶 주 린 사람 static a. 정적 구성원 변수 b. 정적 블록 c. 정적 내부 클래스
  • 매 거 진: static
  • 잠 금 a. AtomicReference CAS 의 장점: 전통 적 인 잠 금 체 제 를 사용 하여 스 레 드 안전 을 확보 할 필요 가 없다. CAS 는 바 쁜 기다 림 을 바탕 으로 하 는 알고리즘 으로 바 텀 하드웨어 의 실현 에 의존 하고 잠 금 에 비해 스 레 드 전환 과 차단 의 추가 소모 가 없 으 며 비교적 큰 병행 도 를 지원 할 수 있다.단점: 바 빠 서 계속 실행 하지 못 하면 CPU 에 큰 비용 이 들 수 있 습 니 다.b. synchronized
  • ThreadLocal

  • 파괴 사례: 반사, 직렬 화
  • 반사 원리: 획득 실례 화
  • 반 서열 화 원리: Object 구조 함수 반사 에 따라 생 성 된다.STEP:
    - readObject()
    - readObject0(false)
    - readOrdinaryObject()  //     
        obj = desc.isInstantiable() ? desc.newInstance() : null;
    - newInstance()
        Object ob = in.readObject(); //       Object
        Target target = (Target) ob; //         Target
    
  • 파괴 차단 사례:
  • 반사 상황: 구조 함수 에 표지 위 치 를 추가 하여 구조 함수 가 한 번 만 호출 될 수 있 도록 한다
  • 반 직렬 화 상황 에 대해 단일 사례 에서 실현 readResolve() 방법.readOrdinary Object () 를 참고 하여 실현 합 니 다.

  • 여러 가지 사례 모델, 파괴 사례 모델, 조직 파괴 사례 모델
    public class ModeSingleton {
        /**
         *     ,      
         */
        static void destroySingletonByReflect() throws Exception {
            SingletonOfHungary singleton = SingletonOfHungary.getInstance();
            SingletonOfHungary newInstance;
    
            Class clazz = SingletonOfHungary.class;
            //         
            Constructor declaredConstructor = clazz.getDeclaredConstructor();
            //          
            declaredConstructor.setAccessible(true);
            //     
            newInstance = declaredConstructor.newInstance();
            System.out.println("singleton.hashCode: " + singleton.hashCode());
            System.out.println("newInstance.hashCode: " + newInstance.hashCode());
        }
    
        /**
         *       ,      
         */
        static void destroySingletonByDeSerialize() throws Exception {
            SingletonOfHungary singleton = SingletonOfHungary.getInstance();
            SingletonOfHungary newInstance;
    
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("tmp"));
            out.writeObject(singleton);
    
            File file = new File("tmp");
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
            //  readObject()    
            newInstance = (SingletonOfHungary) in.readObject();
            System.out.println("singleton.hashCode: " + singleton.hashCode());
            System.out.println("newInstance.hashCode: " + newInstance.hashCode());
        }
    
        /**
         *          。        
         */
        static void stopReflectDestroy() throws Exception {
            SingletonOfInnerStatic singleton = SingletonOfInnerStatic.getInstance();
            SingletonOfInnerStatic newInstance;
    
            Class clazz = SingletonOfInnerStatic.class;
            //         
            Constructor declaredConstructor = clazz.getDeclaredConstructor();
            //          
            declaredConstructor.setAccessible(true);
            //     
            newInstance = declaredConstructor.newInstance();
            System.out.println("singleton.hashCode: " + singleton.hashCode());
            System.out.println("newInstance.hashCode: " + newInstance.hashCode());
        }
    
        /**
         *            。   readResolve()
         */
        static void stopDeSerializeDestroy() throws Exception{
            SingletonOfInnerStatic singleton = SingletonOfInnerStatic.getInstance();
            SingletonOfInnerStatic newInstance;
    
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("tmp"));
            out.writeObject(singleton);
    
            File file = new File("tmp");
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
            //  readObject()    
            newInstance = (SingletonOfInnerStatic) in.readObject();
            System.out.println("singleton.hashCode: " + singleton.hashCode());
            System.out.println("newInstance.hashCode: " + newInstance.hashCode());
        }
    
        public static void main(String[] args) throws Exception {
            System.out.println("  ,      :");
            destroySingletonByReflect();
            System.out.println("    ,      :");
            destroySingletonByDeSerialize();
            System.out.println("         :");
            stopReflectDestroy();
            System.out.println("           ");
            stopDeSerializeDestroy();
        }
    }
    
    /**
     *          -    
     */
    class SingletonOfLazy {
    
        private static SingletonOfLazy instance;
    
        private SingletonOfLazy() {
        }
    
        public static SingletonOfLazy getInstance() {
            if (instance == null) {
                instance = new SingletonOfLazy();
            }
            return instance;
        }
    }
    
    /**
     *   .               -     
     */
    class SingletonOfHungary implements Serializable {
    
        private static SingletonOfHungary instance = new SingletonOfHungary();
    
        private SingletonOfHungary() {
        }
    
        public static SingletonOfHungary getInstance() {
            return instance;
        }
    }
    
    /**
     *   .                     -     
     */
    class SingletonOfInnerStatic implements Serializable{
    
        private static SingletonOfInnerStatic instance;
    
        //       ,              
        private static boolean alreadyExist;
    
        static {
            instance = new SingletonOfInnerStatic();
            alreadyExist = true;
        }
    
        private SingletonOfInnerStatic() {
            if (alreadyExist) {
                System.out.println("        ,      !");
            }
        }
    
        public static SingletonOfInnerStatic getInstance() {
            return instance;
        }
    
        public Object readResolve() {
            return instance;
        }
    }
    
    /**
     *   .              -     
     */
    class SingletonOfInnerClass {
    
        private SingletonOfInnerClass() {
        }
    
        private static class SingletonHolder {
            private static final SingletonOfInnerClass INSTANCE = new SingletonOfInnerClass();
        }
    
        public static SingletonOfInnerClass getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }
    
    /**
     *   .          static            -     
     */
    enum SingletonOfEnum {
        INSTANCE;
    }
    
    /**
     *     -     
     */
    class SingletonOfCAS {
        public static final AtomicReference INSTANCE = new AtomicReference<>();
    
        private SingletonOfCAS() {
        }
    
        public static SingletonOfCAS getInstance() {
            for (; ; ) {
                SingletonOfCAS singleton = INSTANCE.get();
                if (null != singleton) {
                    return singleton;
                }
    
                singleton = new SingletonOfCAS();
                if (INSTANCE.compareAndSet(null, singleton)) {
                    return singleton;
                }
            }
        }
    }
    
    /**
     * ThreadLocal -     
     * ThreadLocal      ,                  ,                 。
     *             ,    (synchronized)   “      ”   , ThreadLocal   “      ”   。
     */
    class SingletonOfThreadLocal {
    
        private SingletonOfThreadLocal() {
        }
    
        private static final ThreadLocal INSTANCE = ThreadLocal.withInitial(SingletonOfThreadLocal::new);
    
        public static SingletonOfThreadLocal getInstance() {
            return INSTANCE.get();
        }
    }
    

    테스트 결과:
      ,      :
    singleton.hashCode: 1163157884
    newInstance.hashCode: 1956725890
        ,      :
    singleton.hashCode: 1163157884
    newInstance.hashCode: 325040804
             :
            ,      !
    singleton.hashCode: 1173230247
    newInstance.hashCode: 856419764
               
    singleton.hashCode: 1173230247
    newInstance.hashCode: 1173230247
    

    추천 디자인 모델 - 단일 모델 의 파괴 가 상세 합 니 다. [주먹 을 안 는. jpg] 를 참고 하 였 습 니 다.

    좋은 웹페이지 즐겨찾기