volatile關鍵字不能保證原子性的示例

環境說明

  • jdk:1.8
  • OS:MacOS 10.13.4

源碼

/**
 * <pre>
 * 程序目的:測試volatile修飾的成員變量,是否具有原子性
 * 主要流程:
 * 	1. 創建容量爲10的Thread對象的數組
 * 	2. 每個Thread執行1_000次 +1 的操作
 * 	3. 主線程等待子線程運行結束
 * 	4. 觀察結果,看最後counter變量的值,是否爲 10_0000
 *
 * 	結論:volatile不能保證原子性。 可以通過添加synchronized關鍵字的方式、來保證原子性
 * </pre>
 * created at 2020-06-07 10:15
 * @author lerry
 */
public class VolatileAtomicDemo {
	public static volatile int counter = 0;

	public static void increase() {
		//synchronized (Object.class) {
		counter++;
		//}
	}

	public static void main(String[] args) throws InterruptedException {
		// 1. 創建容量爲10的Thread對象的數組
		Thread[] threads = new Thread[10];
		for (int i = 0; i < 10; i++) {
			threads[i] = new Thread(() -> {
				// 2. 每個Thread執行1_000次 +1 的操作
				for (int j = 0; j < 1_000; j++) {
					increase();
				}
			});
			threads[i].start();
		}

		// 3. 主線程等待子線程運行結束
		for (Thread thread : threads) {
			thread.join();
		}

		// 4. 觀察結果,看最後counter變量的值,是否爲 10_0000
		// 9523
		System.out.printf("最後counter的數值爲:%d", counter);
	}
}

輸出結果

最後counter的數值爲:8733

加上synchronized修飾後

public static void increase() {
	synchronized (Object.class) {
		counter++;
	}
}

加上synchronized後的輸出結果

最後counter的數值爲:10000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章