Java中的鎖

來源:互聯網
上載者:User

標籤:獲得   調用   之一   設計   寫鎖   java   read   反轉   輕量級   

1.可重新進入鎖

synchronized和Lock都是可重新進入鎖

表明了鎖的分配機制是基於線程,而不是基於方法

例如,在一個同步方法中調用了另一個同步方法,再進入第二個同步方法時,不需要重新申請鎖

 

2.可中斷鎖

synchronized是不可中斷的。

  一個線程已經獲得了某對象的鎖,另一個線程想獲得該對象的鎖時,必須等待,直到第一個線程釋放鎖(執行完、異常)

Lock調用lockInterruptibly方法獲得鎖時,是可中斷的。

  一個線程已經獲得了某對象的鎖,另一個線程想獲得該對象的鎖時,等待,在等待過程中,可以調用該線程的interrupt方法終端等待

 

3.公平鎖、非公平鎖

公平鎖:按照請求的順序獲得鎖

非公平鎖:不保證擷取鎖的順序,輸送量高,造成優先順序反轉或者饑餓現象(有的線程一直等待)

synchronized是非公平鎖

Lock的實作類別:ReentrantLock它預設情況下是非公平鎖,在建立相應對象時,使用重載的構造器,傳入參數(true),設定成公平鎖

 

 4.共用鎖定、排它鎖

共用鎖定:鎖可以被多個線程持有

排它鎖:鎖只能被一個線程持有

synchronized和Lock都是排它鎖

ReadWriteLock(讀寫鎖),其讀鎖是共用鎖定,寫鎖是排它鎖

  

  實作類別ReentrantReadWriteLock

    

5.樂觀鎖、悲觀鎖

樂觀鎖:對同一資料的並行作業,樂觀地認為不會發生修改,在更新資料的時候,嘗試更新(版本)

悲觀鎖:對同一資料的並行作業,悲觀地認為一定會發生修改,加鎖

樂觀鎖:CAS

 

6.分段鎖

分段鎖是一種鎖的設計(ConcurrentHashMap)

 

7.偏向鎖/輕量級鎖/重量級鎖

jdk1.5引入的鎖定擴大機制,實現高效的synchronized

偏向鎖:若同步代碼之一被一個線程訪問,則該線程自動擷取鎖

輕量級鎖:鎖是偏向鎖時,另一線程訪問同步代碼,偏向鎖上升為輕量級鎖,另一線程採用自旋形式擷取鎖,不會阻塞

重量級鎖,鎖是輕量級鎖時,另一線程自旋一定次數之後仍未獲得鎖,阻塞,輕量級鎖上升為重量級鎖

 

8.自旋鎖

  嘗試獲得鎖的線程不會立即阻塞,而是採用迴圈的方式嘗試擷取鎖,減少環境切換的消耗,但是迴圈會消耗CPU

 

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.