ZhouXiangの博客 后端工程师&机器学习爱好者

单例模式简介

2019-05-19

单例模式简介。

单例模式

法1

public class Singleton {
    // 懒汉式——实例私有静态化,构造函数私有化,线程不安全
    private static Singleton instance;  
    private Singleton (){}  
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}  

法2

public class Singleton {
    // 较前者加了同步,但是效率极低,不适用
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}  

法3

public class Singleton {
    // 饿汉式——基于classloder机制避免多线程同步,不能确定有其他的方式(或者其他的静态方法)导致类装载,也没有实现延迟加载
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}  

法4

public class Singleton {
    // 饿汉式变种,差别不大
    private Singleton instance = null;  
    static {  
    instance = new Singleton();  
    }  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return this.instance;  
    }  
}  

法5

public class Singleton {  
    // 静态内部类——同样利用了classloder的机制来保证初始化instance时只有一个线程。
    // 和法3法4不同的是,不主动调用getInstance(),不会装载内部类,从而达到了延迟加载。
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}  

法6

public enum Singleton {
    // 枚举法,强无敌——不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
    INSTANCE;  
    public void whateverMethod() {  
    }  
}  


法7

public class Singleton {  
    // 双重检验锁——懒汉式+volatile+类锁。缺点为无法防御反序列化。
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}  

参考:
http://www.hollischuang.com/archives/205

序列化破坏单例模式

http://www.hollischuang.com/archives/1144


Similar Posts

上一篇 MySQL存储引擎

下一篇 Java代理简介

Comments