3. 단일 패턴의 다양한 쓰기

2009 단어 Android
  • 아사자식:  private static Singleton uniqueInstance = new Singleton(); 
  • 게으름뱅이식 private static Singleton uniqueInstance = null;
  • 동기화되지 않은 게으름뱅이는 라인이 안전하지 않다.예를 들어 두 개의 라인이 있는데 하나는 라인 A이고 하나는 라인 B이다. 그들은 getInstance 방법을 동시에 호출하면 병발 문제를 초래할 수 있다.
  • 아사자식은 라인이 안전하다. 왜냐하면 가상 기기는 한 번만 적재할 수 있기 때문에 적재 클래스가 동시에 발생하지 않을 것이다.

  • 어떻게 게으름뱅이식의 라인 안전을 실현합니까?
    Synchronized를 추가하면 됩니다.
    public static synchronized Singleton getInstance(){}
    

    그러나 이렇게 하면 전체 방문 속도가 떨어지고 매번 판단해야 한다.이중 검사로 자물쇠를 채울 수 있습니다.
    이중 잠금 메커니즘은 getInstance에 들어갈 때마다 동기화가 필요한 것이 아니라 동기화가 안 되는 것이다. 방법에 들어간 후에 실례가 존재하는지 확인하고 존재하지 않으면 아래의 동기화 블록에 들어가는 것이 첫 번째 재검사이다.블록을 동기화한 후 인스턴스가 있는지 다시 확인하고 그렇지 않으면 동기화된 상태에서 인스턴스를 생성합니다.이것은 두 번째 검사다.
    이중 잠금 메커니즘의 실현은 키워드volatile를 사용합니다. 이것은 volatile에 의해 수식된 변수의 값이 로컬 루트에 캐시되지 않고, 이 변수에 대한 읽기와 쓰기는 공유 메모리를 직접 조작하여 여러 루트가 이 변수를 정확하게 처리할 수 있도록 한다는 뜻입니다.
    
    /**
     *            
     * @author dream
     *
     */
    public class Singleton {
    
        /**
         *           volitile   
         */
        private volatile static Singleton instance = null;
        private Singleton(){
    
        }
    
        public static Singleton getInstance(){
            //         ,              
            if(instance == null){
                //   ,         
                synchronized (Singleton.class) {
                    //          ,             
                    instance = new Singleton();
                }
            }
            return instance;
        }
    
    }

    더욱 좋은 단일 실현 방식
    public class Singleton {
    
        /**
         *       ,             ,              
         *       ,            ,         
         * @author dream
         *
         */
        private static class SingletonHolder{
            /**
             *       , JVM       
             */
            private static final Singleton instance = new Singleton();
        }
    
        /**
         *        
         */
        private Singleton(){
    
        }
    
        public static Singleton getInstance(){
            return SingletonHolder.instance;
        }
    }

    좋은 웹페이지 즐겨찾기