樂(lè)觀鎖
樂(lè)觀鎖是一種樂(lè)觀思想惨奕,即認(rèn)為讀多寫(xiě)少胖秒,遇到并發(fā)寫(xiě)的可能性低凤藏,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖叠殷,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒(méi)有去更新這個(gè)數(shù)據(jù)改鲫,采取在寫(xiě)時(shí)先讀出當(dāng)前版本號(hào),然后加鎖操作(比較跟上一次的版本號(hào)林束,如果一樣則更新)像棘,如果失敗則要重復(fù)讀-比較-寫(xiě)的操作。
java中的樂(lè)觀鎖基本都是通過(guò)CAS操作實(shí)現(xiàn)的壶冒,CAS是一種更新的原子操作缕题,比較當(dāng)前值跟傳入值是否一樣,一樣則更新胖腾,否則失敗烟零。
悲觀鎖
悲觀鎖是就是悲觀思想,即認(rèn)為寫(xiě)多咸作,遇到并發(fā)寫(xiě)的可能性高锨阿,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在讀寫(xiě)數(shù)據(jù)的時(shí)候都會(huì)上鎖性宏,這樣別人想讀寫(xiě)這個(gè)數(shù)據(jù)就會(huì)block直到拿到鎖群井。java中的悲觀鎖就是Synchronized,AQS框架下的鎖則是先嘗試cas樂(lè)觀鎖去獲取鎖,獲取不到毫胜,才會(huì)轉(zhuǎn)換為悲觀鎖书斜,如RetreenLock。