自旋鎖和使執行緒休眠的非自旋鎖各有什麼適用場景?

時間 2021-05-05 17:37:32

1樓:invalid s

多個執行緒需要競爭較長時間使用的獨占性資源(印表機/網路等),此時應當用非自旋鎖。

多個執行緒需要修改同乙個資料結構,且修改動作經過精心優化,可以在很少幾個時鐘週期內完成時(典型如「把事先準備好的節點掛到鍊錶末端」),那麼可以用自旋鎖,甚至可以使用無鎖結構。

PS:無鎖是利用CPU提供的原子操作(典型如比較並交換)保證資料一致性,並不是字面意義的不用鎖。

說的更通俗一點:

如果某個資源在上鎖後,取得鎖的執行緒需要做較為複雜的一系列操作(於是需要耗用更多時鐘週期)、然後才能釋放鎖,那麼其它執行緒就應該用非自旋鎖交出執行權。

相反,如果可以通過演算法優化,使得取得鎖的執行緒只需執行很少幾條指令就可以釋放鎖,那麼其它執行緒就可以使用自旋鎖(但是,如果程式是在單核處理器上執行,應無條件使用非自旋鎖。這是因為壓根沒有其他CPU資源供其他執行緒使用,只能等當前執行緒耗盡自己的時間片)。

事實上,「盡量降低鎖的持有時間」是多執行緒演算法設計上的重點和難點所在。只要你清楚知道執行緒持有鎖的時間(精確到時鐘週期),自然就知道什麼時候該用什麼鎖了。

不過,由於執行環境太過複雜,理論預期被實踐打臉是經常發生的。

所以對稍為複雜的場景,最好是直接實現成兩個版本(c/c++可以用巨集控制切換),然後多做profile。

2樓:

對於hotspot來說,原來有PreBlockSpin,現在好像沒用了,變成了自適應自旋,不等於while(true),自旋鎖可以減少執行緒切換的開銷

3樓:白河愁

聽起來好高階。。。

自旋鎖聽起來好像是,啟動乙個執行緒,用while(true)一直去訪問資源,有了資源之後再呼叫某些方法。

4樓:曹旭東

AQS中,在加鎖、放鎖的時候會使用自旋鎖,例如CountDownLatch(GC: CountDownLatch)

隨著多執行緒競爭情況的提公升,對自旋鎖的使用是,不用 -> 用 ->不用。

參見oracle_jrockit_the_definitive_guide/4.3.md at master · caoxudong/oracle_jrockit_the_definitive_guide · GitHub-瘦鎖thin-lock

知乎不能識別github位址中的錨點,還非要給我轉換我貼出來的url位址,蛋疼。

大家在位址裡找4.3.2.2.1節吧。

如何理解互斥鎖 條件鎖 讀寫鎖以及自旋鎖?

嘛,既然你問了這種問題,你的水平大概看其他人的回答會頭大。我就用上廁所來說明吧。讀寫鎖就是兩個人能同時在廁所漱口,但其中乙個準備 XX 了另乙個就會被趕出廁所 既有能同時做的事,也有不能同時做的事,而且當有人做不能同時做的事時,另乙個連能同時做的事都不能做了 互斥鎖就是廁所裡有其它人採花的時候你不能...

正確使用多執行緒同步鎖 synchronized

cauzp 我來簡單說說吧。資本有幾大特性 1.增殖性2.運動性3.往返性4.風險性。舉例來說就是,當你去買公尺作為一種生活必需品時,你用於買公尺的錢就不能作為資本。此時,當你100元買的公尺漲價成200元時,就是增值 而不是增殖 因為,首先你沒有對公尺做任何事情,公尺沒有變化 其次公尺作為生活必需...

單執行緒redis為什麼需要鎖?

單執行緒是Redis的實現模式。分布式鎖是一種業務為了保證資料的一致性策略,既然是一種策略就可以多種方式實現。你問題中提到的這種情況,就是利用Redis的單執行緒來實現這種策略。他們兩者沒有必然的聯絡。無非就是,乙個我現在有什麼樣的需求,另外乙個就是對應的實現方法而已。說說為什麼用Redis實現分布...