天天看點

Android多線程研究(3)——線程同步和互斥及死鎖

為什麼會有線程同步的概念呢?為什麼要同步?什麼是線程同步?先看一段代碼:

輸出結果後,就會發現變量x被兩個線程同時操作,這樣就很容易導緻誤操作。如何才能解決這個問題呢?用線程的同步技術,加上synchronized關鍵字

加上同步後,就可以看到有序的從9輸出到-10.

如果加到TestObj類的fix方法上能不能實作同步呢?

如果将synchronized加到方法上則等價于

可以判斷出兩個線程使用的TestObj類的同一個執行個體testOjb,是以後實作同步,但是輸出的結果卻不是理想的結果。這是因為當A線程執行完x = x - y後還沒有輸出則B線程已經進入開始執行x = x - y.

是以像下面這樣輸出就不會有什麼問題了:

如果将外部的fix方法修改如下:

此時synchronized中的str對象不是同一個對象,是以兩個線程所持有的對象鎖不是同一個,這樣就不能實作同步。要實作線程之間的互斥就要使用同一個對象鎖。

什麼是死鎖呢?舉個例子就是比如你和同學租了個兩室的房子,你拿着你房子的鑰匙,你同學拿着他房子的鑰匙,現在你在房子等你同學将他的鑰匙給你然後你進他房子,你同學在他的房子等你将鑰匙給他然後他進你的房子,這樣就死鎖了。