一、原子更新基本类型类:java
以上3个类提供的方法几乎如出一辙,因此仅以AtomicInteger为例进行详解。数组
package com.test; import java.util.concurrent.atomic.AtomicInteger; public class AtomicTest { static AtomicInteger ai = new AtomicInteger(1); public static void main(String[] args) { System.out.println(ai.getAndIncrement()); System.out.println(ai.get()); } }
二、原子更新数组:this
package com.test; import java.util.concurrent.atomic.AtomicIntegerArray; public class AtomicTest { static int[] value = new int[] {1, 2}; static AtomicIntegerArray ai = new AtomicIntegerArray(value); public static void main(String[] args) { ai.getAndSet(0, 3); System.out.println(ai.get(0)); System.out.println(value[0]); } } // 结果 3 1
须要注意的是,数组value经过构造方法传递进去,而后AtomicIntegerArray会将当前数组复制一份,因此当AtomicIntegerArray对内部的数组元素进行修改时,不会影响传入的数组.atom
三、原子更新引用类型:spa
原子更新基本类型的AtomicInteger,只能更新一个变量。若是要原子更新多个变量,就须要使用这个原子更新引用类型提供的类,包含如下三个。code
package com.test; import java.util.concurrent.atomic.AtomicReference; public class AtomicTest { public static AtomicReference<User> atomicUserRef = new AtomicReference<AtomicTest.User>(); public static void main(String[] args) { User user = new User("张三", 88); atomicUserRef.set(user); User updateUser = new User("李四", 96); atomicUserRef.compareAndSet(user, updateUser); System.out.println(atomicUserRef.get().getName()); System.out.println(atomicUserRef.get().getOld()); } static class User { private String name; private int old; public User(String name, int old) { this.name = name; this.old = old; } public String getName() { return this.name; } public int getOld() { return this.old; } } } // 结果 李四 96
代码首先构建一个User对象,而后把user对象设置进AtomicReferenc中,最后调用compareAndSet方法进行原子更新操做,实现原理同AtomicInteger里的compareAndSet方法.对象
四、原子更新字段类:blog
package com.test; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; public class AtomicTest { // 建立原子更新器,并设置须要更新的对象类和对象的属性 public static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class, "old"); public static void main(String[] args) { User user = new User("张三", 88); System.out.println(a.getAndIncrement(user)); System.out.println(a.get(user)); } public static class User { private String name; // 必须是public而且是volatile public volatile int old; public User(String name, int old) { this.name = name; this.old = old; } public String getName() { return this.name; } public int getOld() { return this.old; } } } //结果 88 89