黑马程序员技术交流社区

标题: 关于懒汉式的同步锁问题。。。 [打印本页]

作者: 苏乞儿    时间: 2014-9-18 23:59
标题: 关于懒汉式的同步锁问题。。。
  1. <p>package cn.itcast;

  2. public class Demo {

  3.         public static void main(String[] args) {

  4.                 Methods m=new Methods();
  5.                 Thread t1=new Thread(m);
  6.                 Thread t2=new Thread(m);
  7.                 Thread t3=new Thread(m);
  8.                 Thread t4=new Thread(m);
  9.                 t1.start();
  10.                 t2.start();
  11.                 t3.start();
  12.                 t4.start();
  13.         }

  14. }
  15. class Single
  16. {
  17.         private Single(){}
  18.         private static  Single s=null;
  19.         public static Single getInstance(){
  20.                 if(s==null)
  21.                 synchronized(Single.class){
  22.                         if(s==null)//如果不加这个if会怎么样呢?
  23.                                 s= new Single();
  24.                 }
  25.                
  26.                 return s;
  27.         }
  28. }
  29. class Methods implements Runnable
  30. {
  31.         public void run(){
  32.                 for(int i=0;i<50;i++){
  33.                         Single s=Single.getInstance();
  34.                         System.out.println(s);
  35.                 }
  36.                        
  37.         }
  38. }</p><p>
  39. </p><p>//为了高效率,加了两个if语句判断,但是如果不加这个if会怎么样呢?
  40. </p>
复制代码

作者: 谢建平    时间: 2014-9-19 02:13
不加的话    synchronized     就费了额      第一个if 倒是可以不写     那写了只是为了提高下效率
作者: 小布袋    时间: 2014-9-19 03:17
同步里面的if一定要加的
作者: 苏乞儿    时间: 2014-9-19 22:44
谢建平 发表于 2014-9-19 02:13
不加的话    synchronized     就费了额      第一个if 倒是可以不写     那写了只是为了提高下效率 ...

怎么就费了呢?线程先判断外边的if为null的话,直接进同步,把s=new Single();第二次循环开始,线程又开始执行,发现s不为null直接return s了吗?
作者: pvting    时间: 2014-9-19 23:20
如果不加,可能不会生成单例了,就是多例了
作者: 王路强    时间: 2014-9-20 00:39
public static Single getInstance(){
                if(s==null)
//两个线程同时运行到此停了,然后第一个唤醒了,进入同步,创建s返回了,然后第二个线程醒了,进去也不判断是否为null,进去创建一个也返回了,就不是单例模式了。如果加了判断,s不为空,则不创建了 。就是单例模式的只能创建一个对象
                synchronized(Single.class){
                        if(s==null)
                                s= new Single();
                }
               
                return s;
        }
作者: 苏乞儿    时间: 2014-9-20 00:41
王路强 发表于 2014-9-20 00:39
public static Single getInstance(){
                if(s==null)
//两个线程同时运行到此停了,然后第 ...

明白了。。。
作者: 王路强    时间: 2014-9-20 00:44
苏乞儿 发表于 2014-9-20 00:41
明白了。。。

加油 还没睡吧  看视频呢?
作者: 苏乞儿    时间: 2014-9-20 00:47
王路强 发表于 2014-9-20 00:44
加油 还没睡吧  看视频呢?

嗯啊,你也是?
作者: 苏乞儿    时间: 2014-9-20 00:48
王路强 发表于 2014-9-20 00:44
加油 还没睡吧  看视频呢?

是不是个黑马币可以换亲友券了?是不是就不用写博客了啊,这事是真的吗?
作者: 王路强    时间: 2014-9-20 00:50
苏乞儿 发表于 2014-9-20 00:48
是不是个黑马币可以换亲友券了?是不是就不用写博客了啊,这事是真的吗? ...

我不知道啊  看视频呢  马上要睡觉了 记得早点睡啊
作者: 苏乞儿    时间: 2014-9-20 00:52
王路强 发表于 2014-9-20 00:50
我不知道啊  看视频呢  马上要睡觉了 记得早点睡啊

嗯啊,这就睡了啊。。。晚安!
作者: 王路强    时间: 2014-9-20 00:55
苏乞儿 发表于 2014-9-20 00:52
嗯啊,这就睡了啊。。。晚安!

晚安 加油啊  !!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2