我是这样理解的,首先我们先看一下懒汉式原有的代码
if(instance==null){
instance = new Single();
}
假如我们使用了多线程技术,线程A进来了判断instance等于null满足,执行权被切换走,等待
线程B进来了,判断instance等于null线程B也等待,假如A线程获得执行权创建了对象,C线程不在
判断标记直接又创建了对象,这样内存中就存在了两个对象。
如果我们在方法上加了同步函数,A线程进来创建了对象并返回,B线程进来也要判断锁,instance不为
null这样我们就解决了问题,但是其他线程进来都需要判断锁这样效率很低。
If(instance == null) {
synchronized(Single.class) {
if(instance == null) {
instance = new Single();
}
}
}
return instance;
我们就可以用同步代码块的
形式创建锁,但是这样和同步函数是一样的,所以在同步代码块上加了一层判断,A线程执行完毕,B线程在
第一层判断不为null就不在执行了,这样做提高了效率。 |