Java線程 — 線程同步及安全問題

來源:互聯網
上載者:User

標籤:;;   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線程 — 線程同步及安全問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.