单例模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。
单线程版本
懒汉模式 & 饿汉模式
懒汉模式
1 | public class Singleton { |
对象引用一开始为 null,具体使用的时候才 new 一个对象出来,这种写法属于懒汉模式。
饿汉模式
1 | public class Singleton { |
顾名思义,单例对象一开始就被 new Singleton() 主动构建,不再需要判空操作,这种写法属于饿汉模式。
多线程版本
如果上面『懒汉模式』的代码是运行在多线程环境中,就会出现许多问题。最明显的一个,将有可能 new 出多个 Singleton 对象实例。最简单的修复方式是在 getInstance() 方法上加 synchronize 关键字。
1 | public class Singleton { |
但是这样的话,不管单例对象有没有构建出来,每次调用 getInstance() 方法的时候都会加锁。 使用 double-checked lock(双检锁) 可以避免在 new 出单例对象之后还对 getInstance() 方法进行加锁,这是对锁粒度细化的一种体现。
1 | public class Singleton { |