黑马程序员技术交流社区

标题: 懒汉式中synchronized(Single.class)是干什么用的? [打印本页]

作者: 李前进    时间: 2014-3-28 17:47
标题: 懒汉式中synchronized(Single.class)是干什么用的?
  1. class single
  2. {
  3.         private static Single s = null;
  4.         private Single(){}

  5.         public static Single getInstance()
  6.         {
  7.                 if(s==null)
  8.                 {
  9.                         synchronized(Single.class)
  10.                         {
  11.                                 if(s==null)
  12.                                         s=new Single();
  13.                         }
  14.                 }
  15.                 return s;
  16.         }
  17. }
复制代码

作者: 霍振鹏    时间: 2014-3-28 17:50
同步代码用的,防止多线程操作时出现异常,目的就是一个线程在执行 if(s==null)
                                        s=new Single();时,另一个线程进不来
作者: H-Deka    时间: 2014-3-28 17:56
同步代码块中的锁,当有一个线程执行同步代码块时,别的线程就不能执行此代码块,有没有现在在执行就看Single.class这个参数了
作者: ._抬眉﹏    时间: 2014-3-28 18:26
同步代码块,当一个线程执行的时候别的线程就不能执行,毕老师说过,Single.class就相当于一个锁,只要single这个类一加载进去内存,这个锁就可以用了。
作者: 龙健    时间: 2014-3-28 18:34
标记同步代码块,在这里保证了只创建一个对象,
懒汉式是说在single中定义了对象,但是并没有实例化,有代码可以看得出,当s为空时,此时就有一个线程获得同步锁并创建出此实例对象,其他线程无法操作,当该线程释放同步锁后,其他的线程也不会去执行同步代码块,因为此时地一个if条件已经不满足了、、、所以保证了single永远都只被创建一次
作者: 橸瑩膤漃寞林    时间: 2014-3-29 17:50
静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象,类名.class,该对象的类型是Class。
静态的同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class。
synchronized(Single.class),读这句是判断锁。
如果 s=new Single();这步已经做了,再来一个线程就直接拿对象用,不能再new对象了,保证对象的唯一性。

作者: 杨殿生    时间: 2014-3-29 20:23
synchronized(Single.class)里面的参数是一个Class类对象,用来控制同步的
作者: Amorvos    时间: 2014-3-29 21:04
synchronized方法需要一个锁用于线程调度时的线程锁定,
你这里同步的代码段位于静态方法中,
因此此时的线程调度锁只能是synchronized(Single.class),
因为说class文件是中只有一份,
作者: syusikoku    时间: 2014-3-29 21:41
这个是懒汉式。它会出现线程安全隐患。因为当一个线程判断对象不存在它就创建可是对象还没有赋上值。其它的线程进进来了。判断的值也为空,也创建了一个,这样在内存中就有两个对象。所以要把这段代码产生互斥。即同时只能由一个线程执行这段代码。并且互斥的时候使用的监视器对象是当前类的字节码文件对象。
作者: ヽし☆ve    时间: 2014-3-29 21:45
懒汉式存在 线程安全问题,一般用同步方法、同步代码快或上锁 来解决,单例模式,一般推荐饿汉式




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