介绍:
第一次看到atomicBoolean 以为是boolean 的一个子类,后来经过调查才发现,这个是一个工具类,不太常用,但是可以起到和 boolean 一样的效果
它主要运用到多线程中。
假如有Program A && Program B ,他们共同使用一个static boolean flag; 作为标准来控制各自的代码如下:
public class ProgA implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
if(flag == true) { //step1
flag = false; //step2
//do something which cause a long time
}
//return the flag to true for other user
flag = true;
}
}
public class ProgB implements Runnable {
@Override
public void run() {
if(flag == true) {
flag = false;
//do something which cause a long time
}
//return the flag to true for other user
flag = true;
}
}
code 希望通过flag 来保证多线程中只有一个相同的work 可以做,然后,在 step1 和 step2 之间,多线程中是无法保证step1 和 step2 是原子操作的,所以
once 的问题就容易出现了,这个时候,private static AtomicBoolean flag2; 来了
AtomicBoolean 能够保证原子操作
private static AtomicBoolean flag2;
if(flag2.compareAndSet(false, true))
这个if语句完成了两件工作,先判断 flag2 是不是等于 false,然后,再将flag2 设置成为true,这样我们的判断就用担心多线程的困扰了,在执行 compareAndSet 语句时,其他
任何程序都会block,只有这个操作完成后,其他程序才会进行.