单例模式
1,最简单的实现
首先在类中新建一个私有的构造函数,这样类就不能被实例话了。然后在类中新建一个私有的静态实例,然后提供一个public方法访问该静态方法,这样使用着就可以使用这个类的实例了。
public class SingletonClass{
pirvate static SingletonClass sInstance = new SingletonClass();
public SingletonClass getInstance(){
return sInstance;
}
private SingletonClass(){
}
}
2,性能优化--------Lazy loaded
上例中不管SingletonClass是否使用都会新建一个实例,如果SingletonClass 很耗时,并且可能用不到。代码的变化有两区,一是新建一个实例,赋值为空,知道第一次使用的时候才会赋值。
public class SingletonClass{
private static SingletonClass sInstance = null;
public SingletonClass getInstance(){
if(null == sInstance){
sInstance = new SingletonClass();
}
return sInstance;
}
private SingletonClass(){
}
}
3,同步
上述程序在单线程没有问题,当在多线程下,比喻A线程希望使用SingletonClass实例,第一次调用,发现sInstance是空,就新建sInstance实例,就在这个时候CPU发生时间片切换,切换到进程B,B也要使用实例,因为切换发生在A线程检测完后,所以sInstance是空。这时候A和B线程就会新建不同的实例。
public class SingletonClass{
pirvate static SingletonClass sInstance = null;
public synchronized SingletonClass getInstance(){
if(null == sInstance){
sInstance = new SingletonClass();
}
return sInstance;
}
private SingletonClass(){}
}
需要使用同步锁,一个线程必须等待另一个线程新建完后,才能使用,这样保证了实例的唯一性。
4,又是性能
每次调用实例前,先判断是否为空,如果为空,在同步新建,如果不为空,直接返回,
public class SingletonClass{
private atatic SingletonClass sInstance = null;
public SingletonClass getInstance(){
if(null == sInstance){
synchronized(SingletonClass.class){
sInstance = new SingletonClass();
}
}
return sInstance;
}
private SingletonClass(){}
}

浙公网安备 33010602011771号