樂(lè)觀鎖
- 每次獲取數(shù)據(jù)的時(shí)候叛赚,都不會(huì)擔(dān)心數(shù)據(jù)被修改澡绩,所以每次獲取數(shù)據(jù)的時(shí)候都不會(huì)進(jìn)行加鎖稽揭,但是在更新數(shù)據(jù)的時(shí)候需要判斷該數(shù)據(jù)是否被別人修改過(guò)。如果數(shù)據(jù)被其他線程修改肥卡,則不進(jìn)行數(shù)據(jù)更新溪掀,如果數(shù)據(jù)沒(méi)有被其他線程修改,則進(jìn)行數(shù)據(jù)更新步鉴。由于數(shù)據(jù)沒(méi)有進(jìn)行加鎖揪胃,期間該數(shù)據(jù)可以被其他線程進(jìn)行讀寫(xiě)操作。
- 比較適合讀取操作比較頻繁的場(chǎng)景氛琢,如果出現(xiàn)大量的寫(xiě)入操作喊递,數(shù)據(jù)發(fā)生沖突的可能性就會(huì)增大,為了保證數(shù)據(jù)的一致性艺沼,應(yīng)用層需要不斷的重新獲取數(shù)據(jù),這樣會(huì)增加大量的查詢操作蕴掏,降低了系統(tǒng)的吞吐量障般。
解決方式
- 版本號(hào)機(jī)制
- 自旋鎖(Compare and Swap)機(jī)制
- 使用volatile 確保本條指令不會(huì)因編譯器的優(yōu)化而省略
被volatile修飾的變量能夠保證每個(gè)線程能夠獲取該變量的最新值,從而避免出現(xiàn)數(shù)據(jù)臟讀的現(xiàn)象盛杰。- AtomicInteger 原子鎖 (java.util.concurrent.atomic)
悲觀鎖
當(dāng)我們要對(duì)一個(gè)數(shù)據(jù)庫(kù)中的一條數(shù)據(jù)進(jìn)行修改的時(shí)候挽荡,為了避免同時(shí)被其他人修改,最好的辦法就是直接對(duì)該數(shù)據(jù)進(jìn)行加鎖以防止并發(fā)即供。這種借助數(shù)據(jù)庫(kù)鎖機(jī)制定拟,在修改數(shù)據(jù)之前先鎖定,再修改的方式被稱之為悲觀并發(fā)控制(又名“悲觀鎖”逗嫡,Pessimistic Concurrency Control青自,縮寫(xiě)“PCC”)。
解決方式
- DB的行鎖驱证、表鎖等
- Synchronized