在 java 中, 单例有很多种写法, 面试时, 手写代码环节, 除了写算法题, 有时候也会让手写单例模式, 这里记录一下单例的几种写法和优缺点.
1. 初级写法
2. 加锁
3. 饿汉式
4. 懒汉式
5. 双锁检验
6. 内部类
1. 初级写法
上面这种写法, 在并发环境下, 会出现多个实例.
2. 加锁
我们优化上面的代码, 遇到并发, 很容易想到加锁, 把获取对象的方法加上关键字 synchronized, 很巧, 这种写法也称为懒汉式单例 , 如下:
但是, 显然, 我们把整个方法都同步了, 效率很低下, 我们可以继续优化, 只在创建实例的地方加上同步, 参考 5 双锁检验.
3. 饿汉式
饿汉式的特点是: 类在加载时就直接初始化了实例. 即使没用到, 也会实例化.
4. 懒汉式
懒汉式的特点是: 用到这个实例时才去调用方法实例化. 这个和 2 中的看起来是一样的, 因为这个实例化方法加了 synchronized , 这样安全一些.
5. 双锁检验
双重非空判断, new 对象前加一次锁.
volatile 关键字, 考虑的是, new 关键字在虚拟机中执行时其实分为很多步骤, 具体原因可以参考深入理解 java 虚拟机一书 (考虑的是这个 new 关键字字节码执行时是非原子性的), 而 volatile 关键字可以防止指令重排.
6. 内部类
推荐一个交流学习群, 里面会分享一些资深架构师录制的视频录像: 有 Spring,MyBatis,Netty 源码分析, 高并发, 高性能, 分布式, 微服务架构的原理, JVM 性能优化这些成为架构师必备的知识体系. 还能领取免费的学习资源, 目前受益良多
点击: 加入
来源: http://www.jianshu.com/p/d78c89ae78bc