簡體   English   中英

阻止鎖定與非阻塞鎖定

[英]Blocking Locks versus Non-Blocking Locks

我在這里想:如果你有2個線程執行需要同步的FAST操作,那么阻塞/上下文切換方法不是更快/更好的非阻塞方法嗎?

通過非阻塞我的意思是:

while(true){if(checkAndGetTheLock())break; }

我唯一能想到的是飢餓(CPU燒壞),如果你有太多的線程在鎖定周圍循環。

如何平衡一種方法與另一種方法?

以下是Java Concurrency in Practice關於該主題的內容:

JVM可以通過自旋等待(重復嘗試獲取鎖定直到成功)或通過操作系統阻止被阻塞的線程來實現阻塞。 哪個更有效取決於上下文切換開銷與鎖定可用之前的時間之間的關系; 對於短等待而言,旋轉等待是優選的,並且對於長時間等待而言,懸掛是優選的。 一些JVM根據過去等待時間的分析數據自適應地在兩者之間進行選擇,但大多數只是暫停等待鎖定的線程。

而且(也就是IMO,最重要的一點):

不要過分擔心無競爭同步的成本。 基本機制已經非常快,JVM可以執行額外的優化,進一步降低或消除成本。 相反,將優化工作集中在實際發生鎖爭用的領域。

那么唯一可以確定的方法是測試它。 談到多線程和性能,你根本無法假設。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM