天天看點

java單例模式-懶漢模式演進總結

 本文是2018年寫的,總結了市面上java單例模式之懶漢模式的所有寫法。實際多線程場景中,前面的一些實作是存在問題的。

public class SingleTon1 {
   private static SingleTon1 instance;
   public static SingleTon1 getInstance() {
        if (instance == null) {
            instance = new SingleTon1();
        }
        return instance;
    }
  private SingleTon1() {}
}
           
public class SingleTon2 {
    private static SingleTon2 instance;
    synchronized public static SingleTon2 getInstance() {
        if (instance == null) {
            instance = new SingleTon2();
        }
        return instance;
    }
    private SingleTon2() {    }
}
           
public class SingleTon3 {
    private static SingleTon3 instance;
    public static SingleTon3 getInstance() {
        synchronized(SingleTon3.class){
            if (instance == null) {
                instance = new SingleTon3();
            }
            return instance;
        }
    }
    private SingleTon3() {    }
}
           
public class SingleTon4 {
    private static SingleTon4 instance;
    public static SingleTon4 getInstance() {
        if (instance == null) {
            synchronized (SingleTon4.class) {
                instance = new SingleTon4();
            }
        }
        return instance;
    }
   private SingleTon4() {   }
}
           
public class SingleTon5 {
    private static SingleTon5 instance;
    public static SingleTon5 getInstance() {
        if (instance == null) {
           synchronized (SingleTon5.class) {
                if(instance == null)
                    instance = new SingleTon5();
            }
        }
        return instance;
    }
   private SingleTon5() {   }
}
           
public class SingleTon6 {
    private volatile static SingleTon6 instance;
    public static SingleTon6 getInstance() {
        if (instance == null) {
            synchronized (SingleTon6.class) {
                if(instance == null)
                    instance = new SingleTon6();
            }
        }
        return instance;
    }
    private SingleTon6() {    }
}
           
//增加了内部類
public class SingleTon7 {
    public static SingleTon7 getInstance() {
        return SingleTonEnum.SingleTon7.getInstance();
    }
    private SingleTon7() {    }
    enum SingleTonEnum {
        SingleTon7;
        private SingleTon7 instance;
        private SingleTonEnum() {
            instance = new SingleTon7();
        }       
        public SingleTon7 getInstance() {    
            return instance;     
        }    
    }
}
           
//增加了内部類
public class SingleTon8 {
    public static SingleTon8 getInstance() {
        return SingleTon8Holder.instance;
    }
    private SingleTon8() {    }
    private static class SingleTon8Holder{
        private static final SingleTon8 instance = new SingleTon8();    
    }
}
           
//不是真正的單例
public class SingleTon9 {
    public static SingleTon9 getInstance() {
        return instanceThreadLocal.get();
    }
    private SingleTon9() {    }
    private static final ThreadLocal<SingleTon9> instanceThreadLocal = 
         ThreadLocal.withInitial(() -> new SingleTon9());
}