1. 程式人生 > >樂觀鎖和悲觀鎖(不看後悔,看了必懂)

樂觀鎖和悲觀鎖(不看後悔,看了必懂)

鎖從巨集觀上分類,分為樂觀鎖和悲觀鎖

樂觀鎖是一種樂觀的思想,每次獲取資料的時候都不擔心資料會被修改,所以每次獲取資料的時候都不會加鎖,但是在更新的時候需要判斷該資料是否被人修改過.如果資料被其他執行緒修改,則不進行資料更新,否則,更新.由於資料沒有加鎖,期間該資料可以被其他執行緒進行讀寫操作

在資料庫中,樂觀鎖主要通過資料版本記錄機制實現,即為資料增加一個版本號,讀取資料時將此版本號一同讀出,更新時對此版本號加1,如果提交資料的版本號大於資料庫當前的版本號則予以更新,否則認為是過期資料

Java中的樂觀鎖大多使用CAS操作實現,CAS是一種更新的原子操作,比較當前值和傳入的值是否一樣,一樣則更新,否則,不更新.

Java中的自旋鎖,輕量級鎖和偏向鎖都屬於樂觀鎖

悲觀鎖是一種悲觀的思想,每次獲取資料的時候都會擔心資料被修改,所以每次獲取資料的時候都會進行加鎖,確保自己在使用的過程中資料不會被別人修改,使用完成後釋放鎖.由於資料進行加鎖,期間對該資料的讀寫操作都會等待

Java中的悲觀鎖就是synchronized(重量級鎖,非公平鎖),AQS下的鎖是先嚐試CAS下的樂觀鎖去獲取鎖,如果獲取不到,才會轉換為悲觀鎖,如ReenTrantLock

 

總結:讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖