一、原子更新基本類型類: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