Java 讀寫鎖是如何實現的

2021-09-12 05:43:33 字數 1035 閱讀 7482

為什麼需要讀寫鎖?

與傳統鎖不同的是讀寫鎖的規則是可以共享讀,但只能乙個寫,總結起來為:讀讀不互斥,讀寫互斥,寫寫互斥,而一般的獨佔鎖是:讀讀互斥,讀寫互斥,寫寫互斥,而場景中往往讀遠遠大於寫,讀寫鎖就是為了這種優化而建立出來的一種機制。

注意是讀遠遠大於寫,一般情況下獨佔鎖的效率低**於高併發下對臨界區的激烈競爭導致執行緒上下文切換。因此當併發不是很高的情況下,讀寫鎖由於需要額外維護讀鎖的狀態,可能還不如獨佔鎖的效率高。因此需要根據實際情況選擇使用。

乙個簡單的讀寫鎖實現

public class readwritelock

// sync

public final boolean releaseshared(int arg)

return false;

}讀鎖的釋放主要是tryreleaseshared(arg)函式,因此拆解其步驟如下:

操作1:清理threadlocal中儲存的獲取鎖數量資訊

操作2:cas修改讀鎖個數,實際上是自減一

清單7:讀鎖的釋放流程

protected final boolean tryreleaseshared(int unused) else

–rh.count;

}// 操作2:迴圈中利用cas修改讀鎖狀態

for (;?

}寫鎖的獲取

清單8:寫鎖的獲取入口

// writelock

public void lock()

// aqs

public final void acquire(int arg)

寫鎖的獲取也主要是tryacquire(arg)方法,這裡也拆解步驟:

操作1:如果讀鎖數量不為0或者寫鎖數量不為0,並且不是重入操作,則獲取失敗。

操作2:如果當前鎖的數量為0,也就是不存在操作1的情況,那麼該執行緒是有資格獲取到寫鎖,因此修改狀態,設定獨佔執行緒為當前執行緒

清單9:寫鎖的獲取

讀寫鎖的實現!

寫程式過程中總免不了用到鎖,雖然大牛們總是推薦無鎖程式設計,但那境界對我來說實在太遠了。專案中的資料資源的訪問,少不了鎖,考慮到都是讀的多,寫的少,於是參考網路,自己實現乙個寫優先的讀寫鎖。windows下的 class rwlock include rwlock.h rwlock rwlock r...

讀寫鎖的實現

首先介紹下pthread cond t。在linux下稱之為狀態變數,與之相關的有下面幾個api int pthread cond init pthread cond t cond,pthread condattr t cond attr int pthread cond signal pthrea...

讀寫鎖的實現

讀寫鎖主要用來解決讀 讀能共存,讀 寫不能共存,寫 寫不能共存的情況,它的 使用場景主要是讀寫分離,比如自己實現乙個快取,在重新整理快取的時候就需要用到讀寫鎖。下面擼上一段 簡單實現以下。author administrator date 2019 3 3 public class cache ca...