懒汉式单例的并发问题

public staitc Single getSingle(){

  if(s == null){

    synchronized(Single.class){  -->B线程,等着A解锁才让进去

      if(s == null){

          -->A线程

        s = new Single();

      }

    }

  return s;

  }

}

思路:

当s == null时,A线程进来了,他加了一下锁后进入第二个if(s ==null){},然后沉睡;此时,B也通过了第一个if(s == null),当B玩下执行时,遇到了synchronized(),发现这里A进行了加锁,没办法B线程只能等着,等A把锁解了。此时,A线程醒来了,它new 了一个对象后,继续玩下执行,然后把锁解了,这是s不等于null了。B发现A解锁了,它继续往下执行,发现s不等于null了,那它直接返回了A创建的那个对象s。当c线程访问getSingle方法时,只需判断s是否为null,而不用去判断锁对象了。因为s不等于null了,所以直接返回对象,这样就提高了效率

懒汉模式是延迟加载的实例,面对多线程访问时,需要进行同步代码块,为了增加效率,又要使用双重判断

如果没有第一个if,那么多线程访问时,每个线程都需要去判断锁,而双重判断模式下,更多机会只需判断if条件,相比较判断锁更有效率

 

posted on 2017-09-27 09:47  龙甲第  阅读(233)  评论(0)    收藏  举报