1. 程式人生 > >從執行緒狀態看樂觀鎖和悲觀鎖

從執行緒狀態看樂觀鎖和悲觀鎖

1-1、眾所周知執行緒有幾種主要的狀態即:新建、就緒、執行、阻塞、死亡狀態。


2-1、悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣其他執行緒想獲取這個資料就會block直到它拿到鎖。當存在競爭時,想獲取到鎖的執行緒狀態從執行變為阻塞。

2-2、樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,當存在競爭時,想獲取到鎖的執行緒進行自旋,當自旋執行緒時間片耗盡時,執行緒狀態從執行變為就緒。

3-1、就緒狀態:執行緒通過cpu的排程可以立刻進入到執行狀態;阻塞狀態時:cpu排程器將忽略執行緒,不會分配給執行緒任何cpu時間,直到執行緒重新進入就緒狀態,它才有可能執行操作。

3-2、因此,當使用悲觀鎖時,執行緒重新進行到執行狀態需要經歷:阻塞->就緒->執行,當使用樂觀鎖時執行緒的執行狀態只需經歷:就緒->執行。

3-3、線上程狀態轉換的過程中,悲觀鎖相對樂觀鎖會多出阻塞這一狀態,同時程式需要從使用者態切換到核心態,競爭執行緒經歷一次進出阻塞佇列,當然會產生更多的消耗,但是這種情況也會減少參與競爭執行緒對cpu執行時間片的佔用。

3-4、因此,當執行緒之間的鎖競爭不激烈時,悲觀鎖會低於樂觀鎖的效能;但是當鎖競爭激烈時,參與競爭的執行緒會長時間做自旋(空轉),無故消耗cpu的執行時間,此時樂觀鎖的效能會低於悲觀鎖。

3-5、具體“競爭激烈與否”,還得根據實際的系統測試結果。


參考文獻:

1、http://blog.csdn.net/peter_teng/article/details/10197785

2、http://www.cnblogs.com/wenjiang/archive/2012/08/28/2660549.html

3、http://www.cnblogs.com/shangxiaofei/p/5569879.html