黑马程序员技术交流社区
标题:
懒汉式?
[打印本页]
作者:
杨芳
时间:
2013-2-24 08:54
标题:
懒汉式?
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();
}
}
return s;
}
}
上面的第二个if(s==null)有什么作用,是否可以不要?
作者:
罗海云
时间:
2013-2-24 09:05
我想肯定有他的作用,就让我来给你解说下.:
class Single
{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{ 有
时候会发生这种情况..全部线程都判断s==null全部走到同步锁的时候,假设一个线程进去后, s就不等于空了..然后其他线程因为上面是if不是while就不会去判断上面那个条件,直接往下走, 假如同步锁里没有那个判断的话,就会出现.每个都要new一遍..会造成安全隐患., 但是可以有个简练代码方式..同步锁里面的if去掉.外部的if改为while.就好了.不仅代码简练,而且不会出现隐患.谢谢..表达的不好.
synchronized( Single.class)
{
if(s==null)?????
s=new Single();
}
}
return s;
}
}
作者:
逍林游
时间:
2013-2-24 09:06
上面的第二个if(s==null)是在第一次一个线程进入synchronized块时,这时肯定没有创建对象吧,所以s=new Single();。
这时有的线程还等待在synchronized块外,当第一个线程创建了s=Single()其他线程进入synchronized块就判断s==null是否相等,明显不等嘛!
所以就只创建一个对象了。
作者:
杨芳
时间:
2013-2-24 09:24
谢谢!!!!!!
作者:
寇弘禄
时间:
2013-2-24 09:37
如果第二个if语句不要会出现重复new对象的情况,如果两个线程同时停在synchronized( Single.class)的前一条语句,则都可以进入同步代码块new对象。
第一个if语句可以不要,但是每次都判断synchronized语句会降低效率,所以在外面先判断一次,如果不为null则不用判断synchronized。
作者:
陈圳
时间:
2013-2-24 09:43
多线程嘛:假设线程比较多.Thread[] t=new Thread[100];
if(s==null) //第三步,只要t[0]醒过来.外围的if()其他的t[2]-t[99]就不用判断了锁了.直接返回s; //关键在于后面的线程不用判断同步锁了.所以提高了效率
{ //t[1]也可以进到这里来,然后有同步锁,进不来.然后又wait()了. //第二步
synchronized( Single.class)
{
if(s==null)????? t[0]先进来了.然后wait()了. //第一步
s=new Single();
}
}
作者:
游灿平
时间:
2013-2-24 12:10
同步代码块中的判断是为了延迟加载用的,即本类实例没有被实例化就创建一个本类实例,有就不创建,
同步外的判断是为了提高效率的,如果前面的线程已经创建的实例,后面的线程就不会进入同步代码块中了,
因为每次线程都要进入同步代码块才知道实例已经被创建了,每个线程都要判断锁,这样效率会比较低,外面
的判断是为了提高效率的,这样说你应该能明白了吧。
public class SingleDemo {
private static SingleDemo s = null;
private SingleDemo(){}
public static SingleDemo getInstance(){
/*如果第一个线程获取到了单例的实例对象,
* 后面的线程再获取实例的时候不需要进入同步代码块中了*/
if(s == null){
//同步代码块用的锁是单例的字节码文件对象,且只能用这个锁
synchronized(SingleDemo.class){
//这个判断是为了解决延迟加载的
if(s == null){
s = new SingleDemo();
}
}
}
return s;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2