Java开发中常用的设计形式(二)—单例形式

二. 饿汉式单例

一. 懒汉式单例

 

public static synchronized Singleton getInstance() {
         if (single == null) {  
             single = new Singleton();
         }  
        return single;
}

 

  1. 在getInstance方法上加同步

View Code

图片 1图片 2

图片 3图片 4

//饿汉式单例类.在类初始化时,已经自行实例化 
public class Singleton1 {
    private Singleton1() {}
    private static final Singleton1 single = new Singleton1();
    //静态工厂方法 
    public static Singleton1 getInstance() {
        return single;
    }
}

  即使线程安全了,不过每一趟都要同步,会影响属性

图片 5图片 6

 

   线程安全的,同时没有品质损耗,所以一般自己倾向于选择这一种

 

public static Singleton getInstance() {
        if (singleton == null) {  
            synchronized (Singleton.class) {  
               if (singleton == null) {  
                  singleton = new Singleton(); 
               }  
            }  
        }  
        return singleton; 
}

View Code

  也是线程安全的,同时幸免了每一趟都一起的品质损耗

  3. 静态内部类

View Code

图片 7图片 8

  饿汉式在类创立的同时就已经创办好一个静态的目的供系统应用,未来不再改变,所以自然是线程安全的。

  2. 再度检查锁定

public class Singleton {  
    private static class LazyHolder {  
       private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
       return LazyHolder.INSTANCE;  
    }  
}  
//懒汉式单例类.在第一次调用的时候实例化自己 
public class Singleton {
    private Singleton() {}
    private static Singleton single=null;
    //静态工厂方法 
    public static Singleton getInstance() {
         if (single == null) {  
             single = new Singleton();
         }  
        return single;
    }
}

View Code

View Code

图片 9图片 10

    以上懒汉式单例是线程不安全的,并发环境下很可能出现七个Singleton实例,要兑现线程安全,有以下两种方法,

  都是对getInstance这几个点子改造,保障了懒汉式单例的线程安全。

相关文章