黑马程序员技术交流社区
标题:
懒汉式
[打印本页]
作者:
孙天
时间:
2012-4-24 21:00
标题:
懒汉式
单例懒汉式线程是不安全的,为什么啊
作者:
赵嘉男
时间:
2012-4-24 21:03
需要在单例的 public static XX getInstance() 上加上 synchronized就可以了
作者:
毕博
时间:
2012-4-24 21:35
//懒汉式 有线程安全问题
//懒汉式可以实现延迟加载
//但是在多线程并发访问的情况下会出现安全问题
//可以通过加同步来解决,只是加上同步效率会稍低,这时候可以再使用双重判断来解决这个低效的问题
//加同步的时候使用的锁是 该类所属的字节码文件对象
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;
}
}
作者:
李震 李震 李震
时间:
2012-4-24 21:45
懒汉式与饿汉式有什么不同?
懒汉式的特点在于延迟加载, 懒汉式延迟加载有没有问题,有
怎么解决,加同步的方式解决,用同步代码块和同步函数都行,但是稍微有些低效。
双重判断可以解决效率问题,加同步的时候,使用的锁是那个该类所属的字节码对象。
*/
class Single{
//懒汉式 ,在多线程访问下会出现安全隐患。懒汉式加了同步会比较低效
private static Single s=null;
private Single(){
}
/*
延迟加载,对象被延迟
s是共享数据,如果多个线程并发访问getInstance,是有可能的!
*/
public static Single getInstance(){
//用双重判断的问题解决了懒汉式的效率问题
if(s==null){
synchronized(Single.class){
if(s==null){
s=new Single();
}
}
}
return s;
}
}
作者:
王德南
时间:
2012-4-24 21:49
遇到多线程问题时,假如现在有两个线程A和线程B,线程A执行到 this.singletonPattern = new SingletonPattern(),正在申请内存分配,可能需要0.001微秒,就在这0.001微秒之内,线程B执行到if(this.singletonPattern == null),你说这个时候这个判断条件是true还是false?是true,那然后呢?线程B也往下走,于是乎就在内存中就有两个SingletonPattern的实例了,看看是不是出问题了?所以,在编写懒汉式单例模式时,应注意线程安全问题
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2