前言
本文我们从一个问题出发来进行探究关于volatile的应用。
问题:单例模式的双重检查锁模式为什么必须加 volatile?
什么是单例模式
单例模式指的是,保证一个类只有一个实例,并且提供一个可以全局访问的入口。
为什么需要使用单例模式
那么我们为什么需要单例呢?其中**一个理由,那就是为了节省内存、节省计算。**因为在很多情况下,我们只需要一个实例就够了,如果出现更多的实例,反而纯属浪费。
下面我们举一个例子来说明这个情况,以一个初始化比较耗时的类来说,代码如下所示:
public class ExpensiveResource {
public ExpensiveResource() {
field1 = // 查询数据库
field2 = // 然后对查到的数据做大量计算
field3 = // 加密、压缩等耗时操作
}
}
这个类在构造的时候,需要查询数据库并对查到的数据做大量计算,所以在第一次构造时,我们花了很多时间来初始化这个对象。但是假设数据库里的数据是不变的,我们就可以把这个对象保存在内存中,那么以后开发的时候就可以直接用这同一个实例了,不需要再次构建新实例。如果每次都重新生成新的实例,则会造成更多的浪费,实在没有必要。
接下来看看需要单例的第二个理由,那就是为了保