/*单例模式*/
//饿汉式
class Single{
private static final Single s=new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
分析:之所以s加了final,这样更严谨,由于初始化成员变量时就new了实例化对象,所以称为饿汉式。
//懒汉式
class Single
{
private static Single s=null;
private Single(){}
public static Single getInstance(){
if(s==null){
synchronized(Single.class){
if(s==null){
s=new Single();
}
}
}
}
}
分析:由于一开始s为空,所以称为懒汉式。第一次s为空进入if,后进入同步代码块。如果发现此时再进来一个线程,那么由于有Single.class作为锁,那么此时第一次进来的线程不结束,第二次的是进不来同步代码块的。
那么第一次的结束同步代码块后释放执行权,第二次进来卡到同步的那个线程则进入里面。结果此时s已经有了实例化对象,所以s!=null,所以不会往里走实例化了。
然后如果此时又来了新的线程,那么外面的s==null就可以阻止了,因为s已经被实例化了。
|
|