黑马程序员技术交流社区
标题:
懒汉式中synchronized(Single.class)是干什么用的?
[打印本页]
作者:
李前进
时间:
2014-3-28 17:47
标题:
懒汉式中synchronized(Single.class)是干什么用的?
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;
}
}
复制代码
作者:
霍振鹏
时间:
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