由于只生成一个实例,因此需要将类的构造函数设为私有,然后生成实例的功能由它内部的函数去实现:
解法一:(只适用于单线程模式)在多线程情况下,下面的代码可能会因为有多个线程同时执行到 if 判断语句,然后同时创建了Singleton的多个实例,从而破坏了单例模式。
class Singleton{
private static Singleton single = null;
private Singleton(){ }
public static Singleton getSingletonObject(){
if ( single == null ) {
single = new Singleton();
}
return single;
}
}
针对上述多线程的问题,我们需要对上述代码进行加锁处理。当一个线程在创建实例的时候,其他线程只能的等待。代码如下所示:
class Singleton{
private static Singleton single = null;
private static Object syncObj = new Object();
public static Singleton getSingletonObject(){
if ( single == null ){
lock(syncObj){
if ( single == null )
single = new Singleton();
}
}
return single;
}
}
分析上述代码,假设当前有两个线程想同时创建一个实例,由于在一个时刻只有一个线程能得到同步锁,当第一个线程加上锁时,第二个线程只能等待,并由第一个线程创建出一个实例。创建之后第一个线程释放同步锁,此时第二个线程可以加上同步锁,并运行接下来的代码。由于加上同步锁后第二个线程会发现当前已经有了一个Singleton对象了,于是便不会再重复创建Singleton的实例,从而保证了单例模式。