A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙天 黑马帝   /  2012-4-24 21:00  /  1581 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

单例懒汉式线程是不安全的,为什么啊

4 个回复

倒序浏览
需要在单例的 public static  XX getInstance() 上加上 synchronized就可以了
回复 使用道具 举报
//懒汉式   有线程安全问题
//懒汉式可以实现延迟加载
//但是在多线程并发访问的情况下会出现安全问题
//可以通过加同步来解决,只是加上同步效率会稍低,这时候可以再使用双重判断来解决这个低效的问题
//加同步的时候使用的锁是 该类所属的字节码文件对象


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;
}
}
回复 使用道具 举报
懒汉式与饿汉式有什么不同?
懒汉式的特点在于延迟加载, 懒汉式延迟加载有没有问题,有
怎么解决,加同步的方式解决,用同步代码块和同步函数都行,但是稍微有些低效。
双重判断可以解决效率问题,加同步的时候,使用的锁是那个该类所属的字节码对象。

*/
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;
               
        }
       
}
回复 使用道具 举报
遇到多线程问题时,假如现在有两个线程A和线程B,线程A执行到 this.singletonPattern = new SingletonPattern(),正在申请内存分配,可能需要0.001微秒,就在这0.001微秒之内,线程B执行到if(this.singletonPattern == null),你说这个时候这个判断条件是true还是false?是true,那然后呢?线程B也往下走,于是乎就在内存中就有两个SingletonPattern的实例了,看看是不是出问题了?所以,在编写懒汉式单例模式时,应注意线程安全问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马