天天看點

Java多線程之synchronized關鍵字全面解析1.0

Java在多線程方面有一個synchronized關鍵字。這個關鍵字可以稱為Java高并發之魂。為什麼要引入synchronized關鍵字呢??我們可以先看一個案例:

首先我們寫一個L類負責列印消息

public class L {
	public static void p(String str) {
		System.out.println(str);
	}
}           

然後我們來寫一個測試類:

public class Test implements Runnable {

	static Test instance = new Test();
	static int i = 0;

	public static void main(String[] args) {
		Thread thread1 = new Thread(instance);
		Thread thread2 = new Thread(instance);

		thread1.start();
		thread2.start();
		while (thread1.isAlive() || thread2.isAlive()) {
		}
		L.p("" + i);

	}

	@Override
	public void run() {
		for (int j = 0; j < 10000; j++)
			i++;
	}
}           

這個代碼很簡單 相信大家都看的明白 就是執行 i++ ,但是按照常理來說我們希望i最後的值是 2W 可是運作會發現 i 的值總是小于2W。 為什麼呢?

這是因為 一個簡單的 i++其實分為三步:

1.讀取i   2. i的值增加1  3.将改變後的 i 的值存到記憶體中。

是以造成結果小于2W的原因就是 thread1中執行完第二步, 還沒來得及進行到第三步, thread2中已經開始執行第一步了。

就比如說 thread1中i的值變成了9 然後它準備把寫入到記憶體中 但是還沒來得及寫入, thread2就開始讀取了,那麼thread2 讀取的值就是8,然後thread2 執行完第二步 ,也變成了9 ,相當于就浪費了一次增加數值的機會。是以得到的結果就會小于2W。

那麼我們該如何避免這種後果呢?請看下一章~~