Java多线程之原子操作类( 二 )


(int i, int delta):以原子更新的方式将数组中索引为i的元素与输入值相加;(int i):以原子更新的方式将数组中索引为i的元素自增加1;(int i, int , int ):将数组中索引为i的位置的元素进行更新
与的方法基本一致,只不过在前者的方法中会多一个指定数组索引位i 。
【Java多线程之原子操作类】使用示例:
public class AtomicExample {private static int[] value = http://www.kingceram.com/post/new int[]{1, 2, 3};private static AtomicIntegerArray integerArray = new AtomicIntegerArray(value);public static void main(String[] args) {//对数组中索引为2的位置的元素加3int result = integerArray.getAndAdd(2, 3);System.out.println(integerArray.get(2));System.out.println(result);}}// 6 3
原子更新引用类型
如果需要原子更新引用类型变量的话,为了保证线程安全,也提供了相关的类:
:原子更新引用类型;:原子更新引用类型里的字段;nce:原子更新带有标记位的引用类型;

Java多线程之原子操作类

文章插图
使用示例:
public class AtomicExample {private static AtomicReference reference = new AtomicReference<>();public static void main(String[] args) {User user1 = new User("a", 1);reference.set(user1);User user2 = new User("b",2);User user = reference.getAndSet(user2);System.out.println(user);System.out.println(reference.get());}static class User {private String userName;private int age;public User(String userName, int age) {this.userName = userName;this.age = age;}@Overridepublic String toString() {return "User{" +"userName='" + userName + '\'' +", age=" + age +'}';}}}// User{userName='a', age=1}// User{userName='b', age=2}
使用示例:
public class AtomicExample {public static void main(String[] args) {AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(Dog.class, String.class, "name");Dog dog1 = new Dog();updater.compareAndSet(dog1, dog1.name, "cat");System.out.println(dog1.name);}}class Dog {volatile String name = "dog1";}
原子更新字段类型
如果需要更新对象的某个字段,同样也提供了相应的原子操作类:
ater:原子更新整型字段类;er:原子更新长整型字段类;
要想使用原子更新字段需要两步操作:
原子更新字段类型类都是抽象类,只能通过静态方法来创建一个更新器,并且需要设置想要更新的类和属性;
更新类的属性必须使用 进行修饰;
dater使用示例:
public class AtomicExample {private static AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");public static void main(String[] args) {User user = new User("a", 1);System.out.println(updater.getAndAdd(user, 5));System.out.println(updater.addAndGet(user, 1));System.out.println(updater.get(user));}static class User {private String userName;public volatile int age;public User(String userName, int age) {this.userName = userName;this.age = age;}@Overridepublic String toString() {return "User{" +"userName='" + userName + '\'' +", age=" + age +'}';}}}
解决CAS的ABA问题
ce:原子更新引用类型,这种更新方式会带有版本号,从而解决CAS的ABA问题
ce使用示例:
public class AtomicExample {public static void main(String[] args) {Integer init1 = 1110;//Integer init2 = 126;AtomicStampedReference reference = new AtomicStampedReference<>(init1, 1);int curent1 = reference.getReference();//Integer current2 = reference.getReference();reference.compareAndSet(reference.getReference(), reference.getReference() + 1, reference.getStamp(), reference.getStamp() + 1);//正确写法//reference.compareAndSet(current2, current2+1, reference.getStamp(), reference.getStamp() + 1);//正确写法//reference.compareAndSet(1110, 1111, reference.getStamp(), reference.getStamp() + 1);//错误写法//reference.compareAndSet(curent1, curent1+1, reference.getStamp(), reference.getStamp() + 1);//错误写法//reference.compareAndSet(current2, current2 + 1, reference.getStamp(), reference.getStamp() + 1);System.out.println("reference.getReference() = " + reference.getReference());}}