黑马程序员技术交流社区
标题:
大家帮忙看下 关于懒汉式的效率问题
[打印本页]
作者:
任献东
时间:
2014-10-12 16:05
标题:
大家帮忙看下 关于懒汉式的效率问题
class Single{
private Single(){
}
private static Single single = null;
public static Single getIntence(){
if(single==null){
//为什么加了双重的判断可以提高效率
synchronized (Single.class) {
if(single==null){
single = new Single();
}
}
}
return single;
}
}
复制代码
//为什么加了双重的判断可以提高效率
作者:
Quasimodo
时间:
2014-10-12 18:28
这里视频里说得已经很清楚了,如果不用双重那么每次进去都要判断锁,所以就很慢
加了双重后,只要有一个线程完成了,后面想要进去的就在外面的if(single==null)这里判断就为假了,就进不去了,也就不用再进行锁的判断。 很明显判断锁肯定要比if(single==null)麻烦得多
所以能提高效率的原因是减少了锁的判断
作者:
liaorubei
时间:
2014-10-12 20:36
这个引起效率问题的主要是synchronized引起的,因为每次进入同步代码块的时候,只允许一个线程进入,
其他的线程将都在等待那个进入同步代码块的线程执行完毕,再极端一点,如果已经在同步代码块的线程此时失去了CPU执行权,那么外面的线程将会等待更久,
而且不管单例对象是否已经实例化,都要每次进行等待,所以执行效率很低,
但是如果在同步代码块外面再加一个判断的话,如果判断到单例引用已经有对象的话,线程就不用走同步代码块里面的内容了,也就是说不用进行等待了,每个线程都可以进行判断,然后直接取得单例引用,而不用排队来取得引用.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2