Java单例模式的各种写法和最优写法推荐

话不多说,直接上代码:

(1)

//只适合单线程环境,懒汉模式
 class Singleton{

    private static Singleton Instance = null;
    
     public Singleton() {
     }
     
     public static Singleton getInstance(){
       if(Instance==null){
           Instance = new Singleton();
       }
        return Instance;
    }
 }
评价:由于只生成一个实例,为防止别人创建该类实例,构造方法为私有属性,只有在实例对象为空时才去创建(为避免重复创建)。

//饿汉模式
 class Singleton{

    private static Singleton Instance = new Singleton();
    
     public Singleton() {
     }
     
     public static Singleton getInstance(){
        return Instance;
    }
 }
评价:开始的时候就创建一个final类型的静态实例对象,以后不会再改变。

//双重判断
class Singleton{

   private static Singleton Instance = null;

    public Singleton() {
    }

    public static Singleton getInstance(){
      if(Instance==null){
          synchronized (Singleton.class) {
              if (Instance == null) {
                  Instance = new Singleton();
              }
          }
      }
       return Instance;
   }
}
评价:经过两次判定,第一次检测到实例为空时,增加同步,同步后再次检测到实例为空时,才创建对象实例。有效防止了在多线程环境下创建多个实例的问题。

(4)
//volatile 关键字的使用
private static volatile Singleton singleton;

volatile 关键字的使用可以解决一定程度上的多线程访问时出现的同步问题,保证一定程度的线程安全。如果整形的变量由volatile修饰,在其值发生改变后,

能够快速被其他线程可见,告知其他线程自己发生改变。

(5)结合volatile的单例模式
 class Singleton{
     private static volatile Singleton Instance=null;
     public Singleton() {
     }

     public static Singleton getInstance(){
       if(Instance==null){
           synchronized (Singleton.class) {
               if (Instance == null) {
                   Instance = new Singleton();
               }
           }
       }
        return Instance;
    }
 }
评价:在volatile 和synchronized 两端线程安全的保护下,保证了多线程访问情况下出现多个实例的问题。volatile 保证在实例对象创建后快速通知其他线程
该对象的实例已经存在,不需要重复创建了。主要突出了可见性。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值