说明
AtomicBoolean 这个类,他是线程安全的,它的compareAndSet方法是利用CAS来实现线程安全的。
方法
public final boolean compareAndSet(boolean expect, boolean update) {
int e = expect ? 1 : 0;
int u = update ? 1 : 0;
return unsafe.compareAndSwapInt(this, valueOffset, e, u);
}
作用
判断对象当时内部值是否为第一个参数,如果是则更新为第二个参数,且返回ture,否则返回false。
用途
保证某段语句只执行一次,只有一个线程执行,类似于锁的操作
示例
当默认初始化为false时,如下:
protected final AtomicBoolean started = new AtomicBoolean(false);
则一个线程把他变为ture,compareAndSet返回ture,进入方法体执行逻辑,那么其他的任何线程进入该方法执行compareAndSet时第一个参数为false,而对象的内部值已经被修改为true,则永远过不了if,例如:
public void start() throws Exception {
try {
if (started.compareAndSet(false, true)) {
try {
// 应对一些场景
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
当以上方法执行结束的时候我把对象的值变成false,compareAndSet可以继续可以将对象则的值设置成true,返回true。
public void stop() {
try {
if (started.compareAndSet(true, false)) {
//场景说明
}
} catch (Exception e) {
e.printStackTrace();
}
}
CAS
这里额外说一下,CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术,Doug lea大神在java同步器中大量使用了CAS技术,鬼斧神工的实现了多线程执行的安全性。
CAS的思想很简单:三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。至于CAS这里不多说,了解可参考https://www.jianshu.com/p/fb6e91b013cc。