黑马程序员技术交流社区

标题: 懒汉式 [打印本页]

作者: 孙天    时间: 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