為什麼需要讀寫鎖?
與傳統鎖不同的是讀寫鎖的規則是可以共享讀,但只能乙個寫,總結起來為:讀讀不互斥,讀寫互斥,寫寫互斥,而一般的獨佔鎖是:讀讀互斥,讀寫互斥,寫寫互斥,而場景中往往讀遠遠大於寫,讀寫鎖就是為了這種優化而建立出來的一種機制。
注意是讀遠遠大於寫,一般情況下獨佔鎖的效率低**於高併發下對臨界區的激烈競爭導致執行緒上下文切換。因此當併發不是很高的情況下,讀寫鎖由於需要額外維護讀鎖的狀態,可能還不如獨佔鎖的效率高。因此需要根據實際情況選擇使用。
乙個簡單的讀寫鎖實現
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...