在很多场景中,都需要用到加载资源等初始化操作,而且只需要初始化一次,那么问题就有了,
- 如何判断为初次操作
- 如果是并发处理,如何保证只初始化一次,不会重复初始化
一、AtomicBoolean神器
java.util.concurrent.atomic.AtomicBoolean ,该布尔操作类保证了一系列的操作都是原子操作,不会受到多线程环境下的并发不安全问题,原理则是依赖神奇的sun.misc.Unsafe支持。
二、推荐使用步骤
public class InitXxxService{ private AtomicBoolean initState = new AtomicBoolean(false); @Override public void init() { if (! initState.compareAndSet(false, true)) {//init once return ; } //TODO 写初始化代码 } }
三、原理简介
public final boolean compareAndSet(boolean expect, boolean update) ;
这个方法的意思是,如果当前AtomicBoolean对象的值与expect相等,那么我们就去更新值为update,并且返回true,否则返回false
这里其实做了两件事:
- 当前值与expect相比较。如果相等继续第二步,如果不相等直接返回false
- 把当前值更新为update,并返回为true
这两步是原子操作,这样就解决了初始化中多线程环境下的并发安全问题。