java線程同步

來源:互聯網
上載者:User

標籤:允許   final   mon   問題:   可重新進入   long   and   資源   預設   

安全執行緒的實現方法。

先來說說幾個概念:

1.同步:多線程並發訪問共用資料的時候,保證共用資料在同一時刻只能被一個(一些,使用訊號量時)線程使用。

2.臨界區:每個進程中訪問臨界資源的那段代碼。

3.臨界資源:每次僅允許一個進程訪問的資源。

4.訊號量:相當於一個計數器,每當一個進程使用一個資源,訊號量-1;進程釋放一個資源,訊號量+1;當訊號量為0時,進程無法使用該資源。

5.互斥量:訊號量的大小為1的情況下,僅有0和1兩個值。

一、互斥->同步,在java中的實現方式有synchronized關鍵字,java.util.concurrent包下的重入鎖ReentrantLock。

  a.synchronized關鍵字,利用monitorenter和monitorexit這兩個位元組碼指令,這兩個位元組碼指令都需要一個reference型別參數指明鎖定和解鎖的對象,而且對於同一條線程來說,同          步塊是可重新進入的,在持有鎖線程未執行完之前,其他嘗試擷取鎖的線程阻塞。

  b.在功能上很相似,但是在代碼寫法上,表現為API層面上的互斥鎖(lock()和unlock()配合try/finally語句塊來完成),並且增加了進階功能:

  ①等待可中斷,持有鎖的線程長期不釋放鎖,等待的線程可以選擇放棄等待。

  ②可以再構造方法上設定true,實現公平鎖,預設非公平鎖。

  ③鎖可以綁定多個條件,一個ReentrantLock對象可以綁定多個Condition對象。

 註:jdk1.5之前在隨著線程數量增多,synchronized效能下降嚴重,1.6之後效能大約一致。其主要問題是線程阻塞和喚醒所帶來的效能問題。

二、非阻塞->同步,採用開放式並行存取策略,先對共用變數進行操作,如果沒有其他線程爭用,則操作成功;否則,採用其他補償措施。

  依賴與硬體:操作和衝突檢測兩個步驟具有原子性。

  java1.5後操作有sun.misc.unsafe類中的compareAndSwapInt()和compareAndSwapLong()提供,這個只能有Bootstrap ClassLoader載入,可以同過juc中的atomicInt類來間接調用。

  但可能會發生“ABA”問題,但一般不會對程式結果產生影響。

  註:“ABA”問題:在程式取值期間另一個線程更改又改回,線程無法判斷。

三、volitile 寫累了,待會再寫。

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.