1. 程式人生 > >【Java併發】Java中的原子操作

【Java併發】Java中的原子操作

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修飾符。

參考

  1. Java併發程式設計的藝術[書籍]