为什么使用单件模式?
有一些对象我们只需要一个,比方说:线程池、缓存等等,如果同时实例化了多个对象反而会出现一些问题。
对于这种类,仅靠程序员凭照约定不实例化,显然是不可靠的。
尝试:创建一个类,把所有的方法和变量都设置成静态的,把类直接当做一个单件使用。
问题:因为静态初始化的控制权是在java手上,这么做可能导致混乱,特别是当有许多类牵涉其中的时候。
尝试:使用全局变量代替单件模式。
问题:在Java中,全局变量基本上就是对对象的静态引用。缺点一,急切实例化VS延迟实例化。缺点二,不能确保只有一个实例。
什么是单件模式?
定义:确保一个类只有一个实例,并提供一个全局访问点。
怎么用单件模式?
将构造器设置为private,即只有类本身才能调用自己的构造函数;
为类设置一个静态方法getInstance()来创建或获取这个实例。
处理多线程:
方法一:同步getInstance()方法,直接给该方法添加synchronize关键字即可
适用情况:getInstance()方法不被频繁运行,或性能不是很关键。
方法二:急切实例化,即在静态初始化器中创建单件,能够保证线程安全
public class Singleton{
private static Singleton uniqueInstance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
)
适用情况:应用总是创建单件,适用单件很频繁
方法三:双重检查加锁
public class Singleton{
private volatile static Singleton uniqueInstance;//必须有volatile关键字,确保初始化成实例时,多个线程正确地处理该变量
private Singleton(){}
public static Singleton getInstance(){
if(uniqueInstance==null){
synchronized(Singleton.class){
if(uniqueInstance==null){
uniqueInstance=new Singleton();
}
}
}
return uniqueInstance;
}
)
适用变量:java5以后可以使用,性能很好。