创建型设计模式之单例模式

单例模式就是在程序的运行过程中有且只有一个实例。
单例类的职责是创建实例,并且保证其唯一。

单例模式一般分为懒汉式和饿汉式创建方式,以下是这两种创建方式的具体代码。

懒汉式:
懒汉式单例模式
懒汉式创建方式是线程不安全的,但是它不会带来不必要的垃圾。

懒汉式创建方式的优化版:
懒汉式创建方式优化版

原理很简单,即对singleton增加了volatile修饰,保证了其有序性和可见性,在利用synchronized对Singleton的类对象进行上锁来保证其唯一性。
当然这种锁的方式粒度还是稍微大了点,因为基本上每个调用都需要争抢锁,由于单例是只需实例化一次,这样就导致了大量的无用消耗。因而我们可以再对其进行优化。

双重判断机制版:
双重判断机制
这里有人会很奇怪的问为什么synchronized里面还要加一个if判断,感觉很多余。但其实,我们锁并不是处于方法级,并发场景下每个线程都能进入方法体,假设某个时刻有两个线程同时访问,则会出现下面这种情况:
并发情况
也就是如果内部没有增加一个if判断,则会有存在创建多个实例的风险

下面我们再来看一下饿汉式创建方式
饿汉式创建方式
这种创建方式的好处在于它是线程安全的,但是它会产生不必要的内存垃圾。为什么说它是线程安全的呢?这得从JVM的类加载方式说起,如图:类加载基本流程
红色框内的是类对象的处理流程,也就是在类初始化期间,JVM会对父类和类变量进行初始化。这就说明了,饿汉式创建方式在程序工作期间,只会存在一个实例,在并发场景下也是一样,故而它是安全的。比较推荐使用这种方式。

下面我们介绍一下饿汉式创建方式的变种:

内部类方式
内部类恶汉单例模式
由于内部类采取延迟加载的方式,即只有当getInstance()方法被首次使用时才会进行加载和初始化。只有一个线程可以得到初始化锁,故而可以保证该对象的的唯一性。这种方式是目前比较推崇的单例模式实现方式。

枚举方式
枚举单例模式
默认枚举是线程安全的,并且全局保持唯一。使用该方式的好处是,枚举类隐藏了默认的构造器,枚举类的域是一个相应的单例对象。比上面的静态内部类的方式代码更加简洁,但是枚举一直较为让人诟病的一点是可读性不是很好。

以上就是单例模式的常见代码逻辑,如果笔者有什么理解不对的地方,欢迎各位给我留言指正(づ ̄3 ̄)づ╭❤~。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值