1. 程式人生 > >Java鎖機制 悲觀鎖和樂觀鎖

Java鎖機制 悲觀鎖和樂觀鎖

鎖的存在,是為了解決在併發環境下,資料的一致性問題。鎖機制保證了程式不會出現,髒讀,衝突等情況。

先介紹下,悲觀鎖和樂觀鎖的基本描述。

悲觀鎖

正如其名,當出現在多使用者的併發環境中時, 它對資料出現併發衝突,持保守態度(悲觀)。它假定一定出現衝突,所以在資料處理過程中,將資料鎖定,使是資料處於獨佔狀態。

樂觀鎖

樂觀鎖的理念與悲觀鎖相反, 在多使用者的併發環境中,它對資料出現併發衝突,吃積極態度(樂觀)。在資料處理中,假定資料不存在衝突,從而不鎖定資料。為了保證資料的一致性,資料通常會有一個版本號。樂觀鎖通過版本號判斷,資料是否被其他人更新過。如果不一致,就重試,或者放棄修改資料。

從java程式設計的角度,悲觀鎖可以理解為通常意義上的同步鎖, 如synchronize,Reentrantlock等。樂觀鎖則是一種更新機制,它保證了資料的一致性,如CAS等。

優缺點

這邊講下在實際應用層面,兩者間的主要不同。正如描述的那樣,悲觀鎖通過加鎖獨佔資料,所以不會出現資料修改衝突,但正因為它的鎖機制,導致併發效率不高,多執行緒時有較多等待。而樂觀鎖,在本質上,對資料並沒有加鎖,所以不存線上程獨佔排他現象,所以併發效率更高。但是在競爭激烈的情況下,由於多次重試,效率反而較低。

所以,它們各有特點,所以具體哪個更合適取決於你的應用場景。一般而言,,對於讀取頻率很高而修改頻率較少的需求可以採用樂觀鎖;資料很敏感且讀取頻率較低的可以採用悲觀鎖的方式。