首先该原子类 中有一个 volatile 字段
这个字段实际用来表示 原子类 对应的结果 (TRUE / FALSE) value 默认为0 即结果为false
其中 显式传参为true value=1 否则 value=0
接下来 下面就是方法调用 在这之前需要了解一个变量
VarHandle 这个类 是JDK 9中新增的类 目的是 为了替换 以往复杂的原子类的原子操作
具体可以去了解 VarHandle 这个类 本文中 VALUE 变量代表 上文 value 的引用
目的是操作value 的值 因为 VarHandle 可以处理 (非静态 静态 数组 通过反射获得的Field )类型字段 具体大家可以百度
上图方法使用了 VarHandle 中的 compareAndSet 方法 目的是使用CAS 操作
因为CAS 操作不了boolean 值 只能给他转化为数字 进行 CAS操作
要注意的是注释的一句话 with memory effects as specified by VarHandle.compareAndSet
意思就是 这个方法实际使用compareAndSet 方法对内存完成整个变量的修改 (当然成功与否 是看能不能抢到锁) 那这个方法 的内存语义进一步的又是什么的?其实就是
setVolatile 这个方法的语义 从这个方法名理解 就是 这个变量是由 volatile 修饰的
对这个变量赋值 同时 对其他线程可见
上图这个方法 看名字 你就很 心虚 weak 而且注释也明明白白的告诉你 possible atomically
大概意思是可能成功 可能失败 他的内存语义对应的是
没有volatile 和 final 修饰 这个变量修改就不会一定成功 其实就是声明一个普通变量 对其进行set
只不过不保证能成功
上图 也是set 方法 但是 它的内存语义 就不是简单的set 而是 setVolatile 因为 value 本身就是 volatile 修饰的
如上图 此方法的内存语义是 VarHandle.setRelease 具体就是如下
主要是确保先前的load(读操作) 和 store(写操作) 不会重排序到此操作后面 (指令重排序)
如上图 其实就是先get 再set 也是 volatile 语义的
上图的get()方法也是volatile 语义的 就是个toString() 方法
上图就是一个获取普通的变量的方法 没有volatile 修饰语义的那种
这个类似 就是 set 方法 没有volatile 修饰的那种
上图 这个方法 的内存语义
按程序顺序访问 但是 相对于其他线程不保证看到的顺序是对应的按程序顺序执行 容易发生内存重排序
这个方法也是如此 执行顺序对其他线程来说不是透明的 容易发生内存重排序
内存语义是
确保后续的load 和 store 不会重排序到此方法调用之前 (指令重排序)
这个方法解释过了 下一个
这个就相当于cas 只不过区别在于 这个
compareAndExchange 方法 返回值 被强转为int 因为最后是 boolean 所以加了个不等于 0 的判断
至于那个compareAndSet 直接返回结果
该方法 是 set 语义 和 getAcquire 语义 组合起来的
该方法是 setRelease 语义和 get 语义 组合起来
这个方法的语义是
如果变量的当前值(称为见证值)=预期值(使用getVolatile的内存语义访问),则可以使用setVolatile的内存语义将变量的值原子地设置为newValue。
即使见证值与预期值匹配,此操作也可能会错误失败(通常是由于内存争用)
这个方法的语义 是 set 和 getAccquire 的组合 这个也容易失败
这个方法的语义是 setRelease 和 get 组合 也容易失败
这就是个日记 大家有什么想法 可以告诉我 我能力一般 只能浅析 谢谢 ⛵



