標籤:;; family mil lock 原子操作 功能 位元組 java線程 run
線程不安全的問題分析:
當多線程並發訪問同一個資來源物件的時候,可能出現線程不安全的問題。
要解決上述多線程並發訪問同一個資源的安全性問題
解決方案:A線程進入操作的時候,B和C線程只能在外等著,A操作結束,A和B和C才有機會進入代碼去執行
方式1:同步代碼塊
文法:
synchronized(同步鎖)
{
需要同步操作的代碼
}
同步鎖:
為了保證每個線程都能正常執行原子操作(幾個操作同時執行),Java引入了線程同步機制。
同步監聽對象/同步鎖/同步監聽器/互斥器:
對象的同步鎖只是一個概念,可以想象為一個對象上標記了一個鎖
Java程式運行使用任何對象作為同步監聽對象,但是一般的我們把當前並發訪問共同資源作為同步監聽對象。
注意:在任何時候,最多允許一個線程擁有同步鎖,誰拿到鎖就進入代碼塊,其他線程只能在外等著
同步鎖是誰:
對於非static方法,同步鎖就是this。
對於static方法,我們使用當前方法所在類的位元組碼對象(對象名.class)
方式2:同步方法
使用synchronized修飾符的方法,就叫做同步方法,保證A線程執行該方法的時候,其他線程只能在方法外等著。
synchronized public void doWork(){
//TODO
}
不要使用synchronized修飾run方法,修飾之後,某一個線程就執行完了所有的功能。好比是多個線程出現串列
解決方案:把需要同步操作的代碼定義在一個新的方法中,並且該方法使用synchronized修飾,再在run方法中調用新的方法即可。
方式3:鎖機制(Lock)
Lock機制提供了比synchronized代碼塊和synchronized方法更廣泛的鎖定操作
void Lock() //擷取鎖
unlock() //釋放鎖
如何編寫參照API文檔。
synchronized的好與壞
好處:保證了多線程並發訪問時的同步操作,避免線程的安全性問題
缺點:使用synchronized的方法/代碼塊的效能比不用要低一些
建議:盡量減小synchronized的範圍
Java線程 — 線程同步及安全問題