设计模式最本质的目的是为了解耦。为了可扩展性和健壮性。
public class Singleton {
private Singleton(){} //构造函数是私有的
private static Singleton single = null;//声明单例对象是静态的
private static Object obj = new Object();
public static Singleton GetInstance()//通过静态方法来构造对象
{
if(single==null)//判断单例对象是否已经被构造
{
lock(obj){//加线程锁
if(single==null)
{single=new Singleton();}
}
}
return single;
}
}
单例模式为了保证系统中只有一个实例,关键点有5
(1)私有构造函数
(2)声明静态单例对象
(3)构造单例对象之前要加锁(lock一个静态的object对象)
(4)需要两次检测单例实例是否已经被构造,分别在锁之前和锁之后
为什么要检测两次:
有可能延迟加载或缓存原因,造成构造多个实例,违反了单例的初衷。
lock住的对象为什么要是object类型:
引用类型的变量地址是相同的,相当于在锁同一扇门。
每个不同的线程在声明的时候值类型变量的地址都不一样,上个线程锁住的东西下个线程进来会认为根本没锁。
所以锁住的必须是引用类型。