单例模式

2019-01-19  本文已影响0人  Edison_Tu
模式告白

我在任何时候都只有一个对象,常被用来管理共享资源,例如数据库的连接,线程池等。

定义

确保一个类只有一个实例,并提供一个全局访问点。

代码样例
懒汉方式

public class HungrySingleton {
    //利用一个静态变量来记录HungrySingleton类的唯一实例
    private static HungrySingleton instance = new HungrySingleton();
    //构造器声明为私有的,只有HungrySingleton类才可以调用
    private HungrySingleton(){

    }
    public static HungrySingleton getInstance(){
        return instance;
    }
}

饿汉方式

利用双重检查加锁(double-checked locking),首先检查实例是否已经创建了,如果尚未创建,“才”进行同步。这样一来,只有第一次会同步,改做法可以减少getInstance()的时间消耗。


public class LazySingleton {
    /**
     * 利用一个静态变量来记录HungrySingleton类的唯一实例;
     * volatile 关键字确保,当instace变量被初始化为LazySingleton实例时,多个线程正确地处理instance变量.
    **/
    private volatile static LazySingleton instance;
    //构造器声明为私有的,只有HungrySingleton类才可以调用
    private LazySingleton(){

    }
    //用“双重检查加锁”,在getInstance()中减少使用同步
    public static LazySingleton getInstance(){
        if(instance == null){
            synchronized (LazySingleton.class){
                if(instance == null){
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }
}

上一篇 下一篇

猜你喜欢

热点阅读