读AtomicBoolean源码之浅析
来源:互联网 发布:如何减腹部的赘肉 知乎 编辑:程序博客网 时间:2024/06/08 10:47
AtomicBoolean位于java.util.concurrent.atomic包下,是java提供给的可以保证数据的原子性操作的一个类。下面通过源码来了解其实现原理。
构造函数:
private volatile int value;/** * Creates a new {@code AtomicBoolean} with the given initial value. * * @param initialValue the initial value */public AtomicBoolean(boolean initialValue) { value = initialValue ? 1 : 0;}/** * Creates a new {@code AtomicBoolean} with initial value {@code false}. */public AtomicBoolean() {}通过上述源码,我们了解到使用AtomicBoolean初始化时可以提供一个初始值。这个value有什么用呢?先看一下这个方法:
public final boolean compareAndSet(boolean expect, boolean update) { return U.compareAndSwapInt(this, VALUE, (expect ? 1 : 0), (update ? 1 : 0));}这个方法是将比较和赋值操作作为一个原子操作,即在进行完比较和赋值操作之前,不会发生任何其他的操作。我们发现该方法的Value和我们初始化AtomicBoolean的并不是一个value啊,那这个Value是什么啊?看源码:
private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();private static final long VALUE;static { try { VALUE = U.objectFieldOffset (AtomicBoolean.class.getDeclaredField("value")); } catch (ReflectiveOperationException e) { throw new Error(e); }}虽然这个两个Value不是一个东西,但是在初始化完成之后,这两个的值确实相等的。这个全部大写的VALUE的意义何在呢?回头看一下compareAndSet方法,在进行比较和赋值操作的时候,用的都是这个VALUE,VALUE是value的一个副本,因为在使用过程中value的值是可以被修改的。
至于比较和赋值操作的结果的返回值都是通过 sun.misc.Unsafe完成的。关于 sun.misc.Unsafe可以查阅:http://blog.csdn.net/dfdsggdgg/article/details/51543545
最后再说明一下compareAndSet方法,这也是实现原子性的关键方法,源码注释如下:
/** * Atomically sets the value to the given updated value * if the current value {@code ==} the expected value. * * @param expect the expected value * @param update the new value * @return {@code true} if successful. False return indicates that * the actual value was not equal to the expected value.
if(expect == VALUE){
返回true,同时再将value的值更新为update的值;
}else{
返回false;
}
示例(来自网上):
- private static class BarWorker implements Runnable {
- private static AtomicBoolean exists = new AtomicBoolean(false);
- private String name;
- public BarWorker(String name) {
- this.name = name;
- }
- public void run() {
- if (exists.compareAndSet(false, true)) {
- System.out.println(name + " enter");
- try {
- System.out.println(name + " working");
- TimeUnit.SECONDS.sleep(2);
- } catch (InterruptedException e) {
- // do nothing
- }
- System.out.println(name + " leave");
- exists.set(false);
- }else{
- System.out.println(name + " give up");
- }
- }
- }
0 0
- 读AtomicBoolean源码之浅析
- AtomicBoolean源码解析
- 读Handler 源码之浅析
- 读AsyncTask源码之浅析
- JavaAPI之AtomicBoolean
- Java类之AtomicBoolean
- atomic包之AtomicBoolean
- AtomicBoolean
- AtomicBoolean
- java 并发之AtomicBoolean、AtomicInteger
- 读IntentService、HandlerThread源码之浅析
- [多线程编程]多线程同步之Object、AtomicBoolean
- java中Atomic类之AtomicBoolean
- java中Atomic类之AtomicBoolean
- java中Atomic类之AtomicBoolean
- java中Atomic类之AtomicBoolean
- java之list源码浅析
- java之Map源码浅析
- 作业2--实训
- 1038. Recover the Smallest Number (30)
- Android RecyclerView详解及实现瀑布流式布局
- Google调试总结
- perl中十进制与十六进制互换函数
- 读AtomicBoolean源码之浅析
- CSS3自定义滚动条样式 -webkit-scrollbar
- Revit二次开发--屏幕截图/图片导出
- delete和drop、truncate的区别
- Linux——grep文本搜索命令
- JavaScript 创建存放对象的数组注意的问题
- MFC “0x00402683”指令引用的“0x00000088”内存,该内存不能为written
- 学习笔记第六周——switch语句之加减乘除
- Mybatis映射文件SQL讲解