2017-05-01 118 views
3

這個comparison of StampedLock and other locks顯示StampedLock是爭用上升速度最快的。然而,這和其他各種文章沒有列出爲什麼它更快。它似乎使用與其他類型的鎖相同的CAS語義?任何人都可以解釋爲什麼它是最快的爭用上升?
例如,在此代碼的下面,writeLock不僅阻塞其他writeLocks,還阻塞readLock。在這一點上,我並不關心樂觀的鎖等。只是簡單的writeLock ..什麼是優勢,它比ReentrantLock更快(再加上它甚至沒有可重入性)。爲什麼Java StampedLock比ReentrantReadWriteLock更快

​​

回答

1

要明確的是,當爭用上升時,StampedLock的讀取速度更快。作家速度要快一些,但速度不及讀取速度快。我會解釋爲什麼。

大多數情況下,使用讀寫鎖定寫入的方式較少。但是,即使這樣,每次您在ReentrantReadWriteLock上獲得readLock()時,都必須增加讀卡器計數。這會強制使用此鎖的所有核心上的緩存失效。

在激烈的競爭中,這可能會導致讀取時顯着減慢。讀取應該很快,當做readLock()時,我們不應該更新變量,這是違反直覺的。

如果相反,我們有一個郵票或讓我們說,版本?每次讀取迭代只更新一次。

對於我們來說,在競爭情況下,如果只有一個線程更新戳值(假設在寫入後),所有讀取線程將在想要讀取鎖時執行緩存命中。這將禁止高速緩存失效,並允許以比RRWL更合適的方式執行鎖定。

使用tryOptimisticRead(如CAS)

  1. 獲取郵票
  2. 讀取值
  3. 先後郵票改變時使用StampedLock模式類似於無鎖算法?
    • 是的,再試一次或發出封鎖讀
    • 不,我們很好,讓我們繼續前進。
+0

嘿,約翰甚至StampedLock似乎可以用在readLock一些寫作..看到這個>> U.compareAndSwapLong(此,州,S,接下來= S + RUNIT) –

+0

因此,約翰,也許只有偉大優化是tryOptimisticRead ..它以上面在步驟1,2,3中描述的方式使用。readLock和writeLock出現磨機運行。 –

+0

這是正確的@ApurvaSingh,'tryOptimisticRead'是這裏真正有用的。 –