鎖定是java並發程式設計中最重要的同步機制。 JAVA中實作加鎖是透過Synchronized關鍵字以及java.util.concurrent套件下的相關類別。
Java中鎖的概念
自旋鎖定: 是指當一個執行緒在取得鎖定的時候,如果鎖定已經被其他執行緒獲取,那麼該執行緒將循環等待,然後不斷判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出循環。
樂觀鎖: 假定沒有衝突,在修改數據時如果發現數據和之前獲取的不一致,則讀最新數據,修改後重試修改
悲觀鎖:假定會發生並發衝突,同步所有對資料的相關操作,從讀取資料開始上鎖
獨享鎖(寫) : 給資源加上寫鎖,擁有該鎖的執行緒可以修改資源,其他執行緒不能再加鎖(單一寫)
共享鎖(讀) : 為資源加上讀鎖後只能讀不能改,其他執行緒也只能加讀鎖,不能加寫鎖(多讀)
可重入鎖:執行緒拿到一把鎖後,可以自由進入同一把鎖所同步的程式碼
不可重入鎖:執行緒拿到一把鎖後,不可以自由進入同一把鎖所同步的代碼
公平鎖定:爭搶鎖的順序,按照先來後到的順序
非公平鎖:爭搶鎖的順序,不按照先來後到的順序
Java中幾種重要的鎖定實作方式:synchronized, ReentrantLock, ReentrantReadWriteLock
同步關鍵字:synchronized
#的作用域:物件鎖定,類別鎖定,分散式鎖定
synchronized特性:可重入,獨享,悲觀鎖定
鎖定最佳化:
鎖定消除是發生在編譯器層級的一種鎖定最佳化方式,是指虛擬機器即時編譯器在執行時,對某些程式碼上要求同步,但是被偵測到不可能存在共享資料競爭的鎖進行削除(開啟鎖定消除的參數:-xx: DoEscapeAnalysis -XX: EliminateLocks)
鎖粗化:是指有些情況下我們反而希望把很多次鎖的請求合併成一個請求,以降低短時間內大量鎖定請求、同步、釋放帶來的效能損耗
Note: synchronized關鍵字,不僅實現同步,JMM中規定,synchronized要保證可見性(不能夠被快取)
synchronized用法程式碼範例:
public class Counter { private static int i = 0; // 等价于 synchronized(this) public synchronized void update() { i++; } public void updateBlock() { synchronized (this) { i++; } } // 等价于 synchronized (Counter.class) public static synchronized void staticUpdate() { i++; } public static void staticUpdateBlock() { synchronized (Counter.class) { i++; } } }
以上是java鎖是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!