1 Atomic 原子类介绍( 四 )


输出结果如下:
currentValue=http://www.kingceram.com/post/0, currentStamp=0currentValue=666, currentStamp=999, casResult=truecurrentValue=666, currentStamp=999currentValue=666, currentStamp=88, attemptStampResult=truecurrentValue=0, currentStamp=0currentValue=666, currentStamp=999, wCasResult=true
4.4 nce 类使用示例
import java.util.concurrent.atomic.AtomicMarkableReference;public class AtomicMarkableReferenceDemo {public static void main(String[] args) {// 实例化、取当前值和 mark 值final Boolean initialRef = null, initialMark = false;final AtomicMarkableReference amr = new AtomicMarkableReference<>(initialRef, initialMark);System.out.println("currentValue="http://www.kingceram.com/post/+ amr.getReference() +", currentMark=" + amr.isMarked());// compare and setfinal Boolean newReference1 = true, newMark1 = true;final boolean casResult = amr.compareAndSet(initialRef, newReference1, initialMark, newMark1);System.out.println("currentValue="http://www.kingceram.com/post/+ amr.getReference()+", currentMark=" + amr.isMarked()+ ", casResult=" + casResult);// 获取当前的值和当前的 mark 值boolean[] arr = new boolean[1];final Boolean currentValue = http://www.kingceram.com/post/amr.get(arr);final boolean currentMark = arr[0];System.out.println("currentValue="http://www.kingceram.com/post/+ currentValue +", currentMark=" + currentMark);// 单独设置 mark 值final boolean attemptMarkResult = amr.attemptMark(newReference1, false);System.out.println("currentValue="http://www.kingceram.com/post/+ amr.getReference()+", currentMark=" + amr.isMarked()+ ", attemptMarkResult=" + attemptMarkResult);// 重新设置当前值和 mark 值amr.set(initialRef, initialMark);System.out.println("currentValue="http://www.kingceram.com/post/+ amr.getReference() +", currentMark=" + amr.isMarked());// [不推荐使用 , 除非搞清楚注释的意思了] weak compare and set// 困惑!weakCompareAndSet 这个方法最终还是调用 compareAndSet 方法 。[版本: jdk-8u191]// 但是注释上写着 "May fail spuriously and does not provide ordering guarantees,// so is only rarely an appropriate alternative to compareAndSet."// todo 感觉有可能是 jvm 通过方法名在 native 方法里面做了转发final boolean wCasResult = amr.weakCompareAndSet(initialRef, newReference1, initialMark, newMark1);System.out.println("currentValue="http://www.kingceram.com/post/+ amr.getReference()+", currentMark=" + amr.isMarked()+ ", wCasResult=" + wCasResult);}}
输出结果如下:
currentValue=http://www.kingceram.com/post/null, currentMark=falsecurrentValue=true, currentMark=true, casResult=truecurrentValue=true, currentMark=truecurrentValue=true, currentMark=false, attemptMarkResult=truecurrentValue=null, currentMark=falsecurrentValue=true, currentMark=true, wCasResult=true
5 对象的属性修改类型原子类 5.1 对象的属性修改类型原子类介绍
如果需要原子更新某个类里的某个字段时 , 需要用到对象的属性修改类型原子类 。
要想原子地更新对象的属性需要两步 。第一步 , 因为对象的属性修改类型原子类都是抽象类 , 所以每次使用都必须使用静态方法 ()创建一个更新器 , 并且需要设置想要更新的类和属性 。第二步 , 更新的对象属性必须使用修饰符 。
上面三个类提供的方法几乎相同 , 所以我们这里以 dater为例子来介绍 。
5.2 dater 类使用示例
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;public class AtomicIntegerFieldUpdaterTest {public static void main(String[] args) {AtomicIntegerFieldUpdater a = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");User user = new User("Java", 22);System.out.println(a.getAndIncrement(user));// 22System.out.println(a.get(user));// 23}}class User {private String name;public volatile int age;public User(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}