目录
一. 单例模式
二. 单例模式的使用时机
三. 单例模式的关键代码
四. 单例模式的几种实现方式
4.1 饿汉方式(急)
4.2 懒汉模式(缓)
a. 解决原子性的问题
b. 解决程序运行效率低下的问题
c. 解决指令重排序的问题(其次是为了解决内存可见性的问题)
五. 总结
一. 单例模式
单例模式是一种设计模式, 表示单个实例(对象), 强制要求一个类中只能有一个实例
二. 单例模式的使用时机
需要控制实例数量, 节省系统资源时使用.
三. 单例模式的关键代码
构造方法必须是私有化的(private), 为了保证这个类只有一个实例.
示例(饿汉模式):
四. 单例模式的几种实现方式
4.1 饿汉方式(急)
饿汉方式是线程安全的, 因为只涉及到赋值操作, 不涉及到修改操作.
4.2 懒汉模式(缓)
此种方式下, 懒汉模式是线程不安全的.
a. 解决原子性的问题
最容易观察到的, 上述代码存在原子性的问题, 因为在 getSingletonLazy方法中涉及到了修改操作, 此时需要加锁解决.
b. 解决程序运行效率低下的问题
两个线程同时启动, 一个线程获取了锁, 进行if判断之后实例化了SingletonLazy对象, 再然后解锁了. 此时另一个线程获取锁, 进行了if判断, 但是并没有实例化对象, 再然后解锁.
此时两个线程, 获取了两次锁, 会使程序的效率降低.
这时就需要两次if判断, 来提高程序的运行效率.
c. 解决指令重排序的问题(其次是为了解决内存可见性的问题)
五. 总结
1. 单例模式就是单个实例对象, 强制要求一个类中只能存在一个实例对象.
2. 单例模式的使用时机是: 需要控制实例数量, 节约内存资源.
3. 单例模式的关键代码: 私有化构造方法(保证一个类中只能存在一个实例对象).
4. 单例模式的几种实现方法: 饿汉模式(线程安全), 懒汉模式(现成不安全 => 解决: 双重if外加锁, 需要明白各个操作的含义).