在很多场景中,都需要用到加载资源等初始化操作,而且只需要初始化一次,那么问题就有了,
?
一、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
?
这里其实做了两件事:
?
?
这两步是原子操作,这样就解决了初始化中多线程环境下的并发安全问题。
原文:http://haoran-10.iteye.com/blog/2307478