首頁 >Java >java教程 >java鎖是什麼?

java鎖是什麼?

青灯夜游
青灯夜游原創
2019-11-15 16:24:205411瀏覽

java鎖是什麼?

鎖定是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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn