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

一. 懒汉式单例

Java 1Java 2

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

View Code

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

  都是对getInstance这些法子改造,保证了懒汉式单例的线程安全。

 

  1. 在getInstance方法上加同步

Java 3Java 4

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

View Code

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

 

  2. 重复检查锁定

Java 5Java 6

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

View Code

Java,  也是线程安全的,同时避免了每一次都一起的习性损耗

 

  3. 静态内部类

Java 7Java 8

public class Singleton {  
    private static class LazyHolder {  
       private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
       return LazyHolder.INSTANCE;  
    }  
}  

View Code

   线程安全的,同时没有性能损耗,所以一般自己倾向于拔取这一种

 

二. 饿汉式单例

Java 9Java 10

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

View Code

  饿汉式在类创造的同时就曾经创建好一个静态的目标供系统应用,以后不再改变,所以自然是线程安全的。

相关文章