模式告白
我在任何时候都只有一个对象,常被用来管理共享资源,例如数据库的连接,线程池等。
定义
确保一个类只有一个实例,并提供一个全局访问点。
代码样例
懒汉方式
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;
}
}
网友评论