1、樂觀鎖:
樂觀鎖在操作數據的時候,是保持一種樂觀的狀態,認為別的線程是不會同時修改數據的,所以是不會上鎖的,但是在更新的時候,會判斷一下在這個期間內是否有別的線程修改過數據。
主要的流程:
1、假設兩個線程,線程A和線程B直接獲取同步數據資源,不會加鎖,執行各自的操作。
2、線程A和線程B在更行同步資源的時候,都會去判斷一下資源是否被其他的線程修改過。
3、如果同步資源沒有被其他的資源修改后,會直接更新內存中同步資源的值
4、如果同步資源被其他的線程修改過,那么根據需要執行不同的操作,直接報錯或者是重試。
2、悲觀鎖:
悲觀鎖在操作數據的時候,保持的是一種比較悲觀的狀態,在每次拿取數據的時候都認為別的線程也會同時的修改數據,所以每次在拿數據的時候都會給數據上鎖,這樣別線程想要拿這個數據就會被阻塞,直到拿到鎖。
主要的流程:
1、多個線程,如線程A,B嘗試獲取同步鎖
2、假設線程A先加鎖成功并執行對應的操作,那么線程B只能等待線程A釋放鎖之后才能操作,線程B處于阻塞狀態
3、線程A釋放同步鎖,然后CPU會喚醒等待的線程,即線程B會再次嘗試獲取鎖
4、線程B成功獲取鎖,再執行自己的操作
缺點:
是需要阻塞的,效率比較低
可能會造成某個線程的永久等待,即死鎖的可能性比較大。
?