每年的三四月份都是找工作的高潮時期,被稱之爲“金三銀四”。在其間基礎知識是必備的。我也是初學者入門級。很多時候去面試都會被問到多線程的問題。今天總結一下悲觀鎖和樂觀鎖。
樂觀鎖:
悲觀鎖顧名思義悲觀二字,想法處於樂觀狀態。當一個共享的資源被多個線程進行操作的時候,
不會進行上鎖,而在進行更新,將要改變這個共享資源的值的時候他會去檢查有沒有被其他線程所操作,
一般使用版本控制Version 或者 CAS機制來實現
例如:進行數據庫操作的時候 把版本號version一起查詢出來
select order_id, order_num, version form order where order_id = #orderId#
在進行插入操作的時候對 version 進行檢查 如果上一次查找出來的version和進行插入操作時數據庫裏面的version一致
可以進行更新操作,並且更新version = version + 1 否則更新失敗
悲觀鎖:
簡單點說就是一個共享資源在被多線程操作的時候,每次只會被一個線程使用,其他沒有拿到使用權的會被阻塞,
當一個線程使用完了之後會把資源讓給其他線程使用, 比如JAVA中的Synchronized和經常使用的lock(ReentranLock)
總結:
樂觀鎖比較適合使用在多讀寫少的情況下,使用的版本控制的方式(無鎖),減少的系統開銷,提高系統吞吐量。但是會出現CAS的ABA和自旋CAS(不成功會被一直執行到成功)的問題。
悲觀鎖比較適合使用在寫多讀少的情況下。
注:在線程衝突少,資源競爭較少的情況下使用synchronized進行線程阻塞和喚醒切換會很浪費CPU資源,這個時候使用CAS機制,自旋機率低。
在線程衝突嚴重,資源競爭大的情況下使用synchronized會比CAS機制好,他的自旋機率會很大,浪費系統性能