【Java併發】Java中的原子操作
阿新 • • 發佈:2018-12-03
Java中的原子操作
原子更新基本型別
一個生動的例子
public class AtomicIntegerExample {
private static AtomicInteger atomicInteger = new AtomicInteger(1);
public static void main(String[] args) {
System.out.println(atomicInteger.getAndIncrement ());
System.out.println(atomicInteger.get());
}
}
原子更新陣列
一個生動的例子
public class AtomicIntegerArrayExample {
static int[] value = new int[] { 1, 2 };
static AtomicIntegerArray ai = new AtomicIntegerArray(value);
public static void main(String[] args) {
System.out.println(ai.getAndSet( 0, 3));
System.out.println(ai.get(0));
System.out.println(value[0]);
}
}
陣列value是通過建構函式傳遞進去,然後AtomicIntegerArray 會將當前陣列複製一份
原子更新引用型別
一個生動的例子
public class AtomicReferenceExample {
public static void main(String[] args) {
User user = new User("conan", 15);
AtomicReference<User> atomicReference = new AtomicReference<User>();
atomicReference.set(user);
User updateUser = new User("Shinichi", 17);
atomicReference.compareAndSet(user, updateUser);
System.out.println(atomicReference.get().getName());
System.out.println(user.getName());
}
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 name;
}
public int getOld() {
return old;
}
}
}
原子更新欄位類
一個生動的例子
public class AtomicIntegerFieldUpdaterExample {
public static void main(String[] args) {
AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
User conan = new User("conan", 10);
System.out.println(a.getAndIncrement(conan));
System.out.println(a.get(conan));
System.out.println(conan.getOld());
}
static class User {
private String name;
public volatile int old;
public User(String name, int old) {
this.name = name;
this.old = old;
}
public String getName() {
return name;
}
public int getOld() {
return old;
}
}
}
更新類的欄位必須使用public volatile修飾符。
參考
- Java併發程式設計的藝術[書籍]