java中的鎖——樂觀鎖 / 悲觀鎖

【筆記】java中的所有鎖


一、悲觀鎖

總是假設最壞的情況,每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完後再把資源轉讓給其它線程)。傳統的關係型數據庫裏邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨佔鎖就是悲觀鎖思想的實現。

優點:觀鎖利用數據庫中的鎖機制來實現數據變化的順序執行,這是最有效的辦法

缺點:一個事務用悲觀鎖對數據加鎖之後,其他事務將不能對加鎖的數據進行除了查詢以外的所有操作,如果該事務執行時間很長,那麼其他事務將一直等待,那勢必影響我們系統的吞吐量。

二、樂觀鎖

總是假設最好的情況,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號機制和CAS算法實現。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫提供的類似於write_condition機制,其實都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實現方式CAS實現的。

優點:樂觀鎖不在數據庫上加鎖,任何事務都可以對數據進行操作,在更新時才進行校驗,這樣就避免了悲觀鎖造成的吞吐量下降的劣勢。

缺點:樂觀鎖因爲時通過我們人爲實現的,它僅僅適用於我們自己業務中,如果有外來事務插入,那麼就可能發生錯誤。


java中的1.公平鎖 / 非公平鎖

java中的2.可重入鎖 / 不可重入鎖

java中的3.獨享鎖 / 共享鎖/AOS

java中的4.互斥鎖 / 讀寫鎖

java中的5.樂觀鎖 / 悲觀鎖

java中的6.分段鎖

java中的7.偏向鎖 / 輕量級鎖 / 重量級鎖

java中的8.自旋鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章