java.util.concurrent.atomic.AtomicBoolean类提供对底层布尔值的操作,可以原子方式读取和写入,还包含高级原子操作. AtomicBoolean支持对底层布尔变量的原子操作.它具有get和set方法,类似于对volatile变量的读写操作.也就是说,一个集合与之前的相关变量的任何后续获取具有先发生关系.原子compareAndSet方法也具有这些内存一致性功能.
以下是AtomicBoolean类中可用的重要方法列表.
Sr.No. | 方法&说明 |
---|---|
1 | public boolean compareAndSet(boolean expect,boolean update) 如果当前值==期望值,则以原子方式将值设置为给定的更新值. |
2 | public boolean get() 返回当前值. |
3 | public boolean getAndSet(boolean newValue) 以原子方式设置为给定值并返回先前的值. |
4 | public void lazySet(boolean newValue) 最终设置为给定值. |
5 | public void set(boolean newValue) 无条件地设置为给定值. |
6 | public String toString() 返回当前值的String表示. |
7 | public boolean weakCompareAndSet(boolean expect,boolean update) 如果当前值==预期值,则以原子方式将值设置为给定的更新值. |
以下TestThread程序显示了AtomicBoolean变量的用法基于线程的环境.
import java.util.concurrent.atomic.AtomicBoolean; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { final AtomicBoolean atomicBoolean = new AtomicBoolean(false); new Thread("Thread 1") { public void run() { while(true) { System.out.println(Thread.currentThread().getName() +" Waiting for Thread 2 to set Atomic variable to true. Current value is " + atomicBoolean.get()); if(atomicBoolean.compareAndSet(true, false)) { System.out.println("Done!"); break; } } }; }.start(); new Thread("Thread 2") { public void run() { System.out.println(Thread.currentThread().getName() + ", Atomic Variable: " +atomicBoolean.get()); System.out.println(Thread.currentThread().getName() + " is setting the variable to true "); atomicBoolean.set(true); System.out.println(Thread.currentThread().getName() + ", Atomic Variable: " +atomicBoolean.get()); }; }.start(); } }
这将产生以下结果.
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false Thread 2, Atomic Variable: false Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false Thread 2 is setting the variable to true Thread 2, Atomic Variable: true Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false Done!