单例模式的双重检测

最近学习多线程 发现提到一个单例模式的l检测研究了一下确实发现很麻烦 写下来以备后用

1、饿汉式单例模式 所谓饿汉式就是不管原来有没有上来就新创建一个 不管肚子里面有没有先吃一个再说

public class Singleton {
      public static Singleton singleton=new Singleton();
     public Singleton(){};
     public static Singleton getSingleton(){
           return singleton;
     }

}

2、饱汉模式单例  所谓饱汉式就是先看下自己吃饱没 没吃饱再吃 吃饱了就直接拍肚

public class Singleton{
  public static Singleton singleton=null;
  public Singleton(){};
  public static Singleton getSingleton()<span style="font-family: Arial, Helvetica, sans-serif;">{</span>
         if(singleton==null){
            singleton=new Singleton();
          }
          return singleton;

  }

}
饿汉式反应快但是占资源多 饱汉式反应慢 每次都需要检查一下有没有吃饱但是占资源少  为解决饿汉式占资源多的瓶颈出现一种 双重检测的单例模式(有重大缺陷)

3、单例模式的双重检测(双重检测锁定失败的原因是jvm的无序写入 请看代码xxxxxx处 若线程1执行到此处 在构造函数执行之前得到一个非空的对象   线程2再拿的时候是非空 但是不是一个经过赋值的对象) 

public class Singleton{
  public volatile static Singleton singleton=null;
  public Singleton(){};
  public static Singleton getSingleton(){
     if(singleton==null){
         synchronized(Singleton.class){
              singleton=new Singleton();  //xxxxxx
          } 
     }
      return singleton;
  }

}

4、解决单例模式的双重检测 ThreadLocal模式的单例

public class Singleton{
  public static final ThreadLocal  threadInstance=new ThreadLocal();
 public static Singleton singleton=null;
  public static getSingleton(){
     if(threadInstance.get()==null){
         createSingleton();
      }
  }
  public static Singleton createSingleton(){
     synchronized(Singleton.class){
       if(singleton==null){
            singleton=new Singleton();
        }
      }
  }

} 
借助了ThreadLocal的全局变量局部化 第一次检测采用线程局部来做如果线程已经访问过则不需要进入同步块




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值