多執行緒2

weixin_34239169發表於2017-07-26

1.同步:多個執行緒需要對同一資料的存取。兩銀行賬戶資金互轉,如果兩個執行緒同時取A賬戶金額100,轉50給賬戶B,A賬戶只減了50,B賬戶卻加了100;

2.鎖物件:synchronized;Lock l=new ReentrantLock();

ReentrantLock()如果傳入true,得到一個公平策略鎖物件,等待時間越長的執行緒越容易獲得該鎖,該鎖會大大降低效能。

l.lock()加鎖;l.unlock()釋放鎖;為了防止程式丟擲異常,不釋放鎖從而造成死鎖,應該在finally塊中釋放鎖;

3.條件物件:當執行緒進入臨界區,卻發現只有某一條件滿足之後才能執行,要用條件物件管理那些獲得了鎖卻不能做有用工作的執行緒。

銀行賬戶轉賬問題說明:一個執行緒獲得鎖物件,進行轉賬時發現賬戶餘額不足,就不能進行轉賬,其他執行緒也不能對該賬戶進行存錢,因為鎖具有排它性,所有需要條件物件。

鎖物件呼叫newCondition()獲得條件物件Cindition,條件物件.await()當前物件阻塞並放棄鎖;signal()隨機解除當前條件物件的等待集中某個執行緒的阻塞狀態,signalAll()解除當前條件物件等待集中所有執行緒。

await()用法:

while(條件判斷){Condition物件.await();  }

解除阻塞並得到鎖的執行緒會從阻塞的地方開始執行。


4.synchronized:每個物件有個內部鎖,該鎖有個內部條件,內部鎖控制要進入synchronized方法的執行緒,內部條件管理呼叫了wait()的執行緒。



6328358-eae5e4cc3d517410.png
圖片發自簡書App

儘量不使用synchronized與Lock/Condition而使用concurrent包工具。

5.同步阻塞:進入一個同步阻塞獲得鎖synchronized(obj){。。。}

6.監視器:

相關文章