比讀寫鎖更快的StampedLock

2021-10-14 16:04:56 字數 1354 閱讀 6218

readwritelock支援兩種模式:讀鎖、寫鎖;

stampedlock支援三種模式:悲觀讀鎖、寫鎖、樂觀讀;

stampedlock的悲觀讀鎖和寫鎖 與 readwritelock的讀鎖和寫鎖 語義相似,允許多個執行緒獲取悲觀讀鎖,只允許乙個執行緒獲取寫鎖,寫鎖和悲觀讀鎖是互斥的。

不同的是stampedlock的悲觀讀鎖和寫鎖在加鎖成功後,都會返回乙個stamp,解鎖時,需要傳入這個stamp。

final stampedlock sl = new stampedlock();

// 獲取、釋放悲觀讀鎖示意**

long stamp = sl.readlock();

try finally

// 獲取、釋放寫鎖示意**

long stamp = sl.writelock();

try finally

stampedlock的效能比readwritelock好的關鍵是支援樂觀讀的方式。readwritelock支援多個執行緒同時讀,但是當多個執行緒同時讀的時候,所有的寫操作會被阻塞;

而stampedlock的樂觀讀是允許乙個執行緒獲取寫鎖的。

class point  finally 

}return math.sqrt(curx * curx + cury * cury);

}}

stampedlock不可重入,悲觀讀鎖和寫鎖都不支援條件變數。

使用stampedlock不要呼叫中斷操作,可能引發cpu暴漲,如果需要支援中斷功能,一定使用可中斷的悲觀讀鎖 readlockinterruptibly() 和寫鎖 writelockinterruptibly()。

stampedlock讀模板

final stampedlock sl = new stampedlock();

// 樂觀讀

long stamp = sl.tryoptimisticread();

// 讀入方法區域性變數

......

// 校驗stamp

if (!sl.validate(stamp)) finally

}//使用方法區域性變數執行業務操作

......

stampedlock寫模板

Java8對讀寫鎖的改進 StampedLock

該類是乙個讀寫鎖的改進,它的思想是讀寫鎖中讀不僅不阻塞讀,同時也不應該阻塞寫。讀不阻塞寫的實現思路 在讀的時候如果發生了寫,則應當重讀而不是在讀的時候直接阻塞寫!因為在讀執行緒非常多而寫執行緒比較少的情況下,寫執行緒可能發生飢餓現象,也就是因為大量的讀執行緒存在並且讀執行緒都阻塞寫執行緒,因此寫執行...

Slim讀 寫鎖(SRWLock)及同步方式比較

一 srwlock鎖的工作原理 srwlock鎖的目的和關鍵段相同 對乙個資源進行保護,不讓其他執行緒訪問它。但是,與關鍵段不同的是 srwlock鎖允許我們區分哪些想要讀取資源的值的執行緒 讀取者執行緒 和想要更新資源的值的執行緒 寫入者執行緒 讓所有的讀取者執行緒在同一時刻訪問共享資源應該是可行...

「快速排序」比冒泡更好 更快的排序

突然想起今天面試的快速排序 快速排序 比冒泡更好 更快的排序 高快省的排序演算法 假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它用來做啥的了 為了方便,就讓第乙個數6作...