饿汉模式的实现

本文探讨了单例模式的不同实现方式,包括不适用于多线程的简单方法、效率低下的线程不安全版本,以及使用同步锁提高效率并确保唯一实例的改进版。重点讲解了SingletonDemo3的加锁机制及其在多线程环境中的优化策略。
摘要由CSDN通过智能技术生成

学习设计模式之后,我们会接触到单例模式,单例模式呢有两种实现,饿汉模式和懒汉模式,饿汉模式相对比较简单,就是一开始就把对象创建好,需要了就直接调用就行,那么懒汉模式则是等到要用的时候才去创建对象,这就涉及到重复创建的问题。下面来看单例模式的几种实现
1.不好的解法一:只适用于单线程场景

public class SingletonDemo1 {


    private static SingletonDemo1 instance;

    private SingletonDemo1(){};

    public static SingletonDemo1 getInstance(){
        if (instance == null) {

            instance = new SingletonDemo1();

        }
        return instance;
    }
}

2.不好的解法二:虽然在多线程环境但效率不高

public class SingletonDemo2 {

private static SingletonDemo2 instance;

    private SingletonDemo2(){};

    public static synchronized SingletonDemo2 getInstance(){
        if (instance == null) {

            instance = new SingletonDemo2();

        }
        return instance;
    }
   }

3.可行的解法三:加同步锁前后两次判断实例是否已经存在

public class SingletonDemo3 {
private static SingletonDemo3 instance;

    private SingletonDemo3(){};

    public static  SingletonDemo3 getInstance(){
        if (instance == null) {
            synchronized (SingletonDemo3.class) {
                if (instance == null) {
                    instance = new SingletonDemo3();
                }
            }
        }
        return instance;
    }
  }

 SingletonDemo3中只有在instance为null时即没有创建时,需要加锁操作。当instance已经创建出来后,就不需要加锁了,SingletoonDemo3用加锁机制来确保在多线程环境下只创建一个实例,并且用两个if判断来提高效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值