Java多線程:樂觀鎖、悲觀鎖、自旋鎖
悲觀鎖(suo)(Pessimistic Lock), 顧名(ming)思義(yi),就是很悲觀,每次(ci)去(qu)拿數(shu)(shu)(shu)據(ju)(ju)的(de)時候都(dou)(dou)認(ren)為別人(ren)會修改,所以每次(ci)在拿數(shu)(shu)(shu)據(ju)(ju)的(de)時候都(dou)(dou)會上鎖(suo),這(zhe)(zhe)樣別人(ren)想拿這(zhe)(zhe)個數(shu)(shu)(shu)據(ju)(ju)就會block直到它(ta)拿到鎖(suo)。傳統的(de)關系(xi)型數(shu)(shu)(shu)據(ju)(ju)庫(ku)里邊(bian)就用到了很多這(zhe)(zhe)種(zhong)鎖(suo)機(ji)制(zhi),比如行(xing)鎖(suo),表(biao)鎖(suo)等(deng),讀鎖(suo),寫鎖(suo)等(deng),都(dou)(dou)是在做操作之(zhi)前先上鎖(suo)。
樂(le)(le)(le)觀(guan)鎖(suo)(Optimistic Lock), 顧名思義,就是(shi)(shi)(shi)很樂(le)(le)(le)觀(guan),每次去拿(na)數(shu)據(ju)的(de)(de)時候都認為別(bie)人(ren)不(bu)(bu)會修改,所以不(bu)(bu)會上(shang)鎖(suo),但是(shi)(shi)(shi)在更新的(de)(de)時候會判斷一下(xia)在此期間別(bie)人(ren)有沒(mei)有去更新這個數(shu)據(ju),可以使用(yong)版本號等機(ji)制(zhi)。樂(le)(le)(le)觀(guan)鎖(suo)適用(yong)于多讀的(de)(de)應用(yong)類型,這樣可以提(ti)高吞吐量,像(xiang)數(shu)據(ju)庫如(ru)果提(ti)供類似(si)于write_condition機(ji)制(zhi)的(de)(de)其(qi)實(shi)都是(shi)(shi)(shi)提(ti)供的(de)(de)樂(le)(le)(le)觀(guan)鎖(suo)。
兩(liang)種鎖(suo)各有優(you)缺點,不可(ke)認為一(yi)種好于(yu)另(ling)一(yi)種,像(xiang)樂觀鎖(suo)適(shi)用于(yu)寫比較少的(de)情(qing)況(kuang)下,即沖突真的(de)很少發生的(de)時候,這(zhe)樣可(ke)以(yi)省(sheng)去了鎖(suo)的(de)開銷(xiao),加大(da)了系(xi)統(tong)的(de)整(zheng)個吞吐(tu)量。但如果經(jing)常(chang)產(chan)生沖突,上層應(ying)用會不斷的(de)進行retry,這(zhe)樣反倒是降(jiang)低了性能(neng),所以(yi)這(zhe)種情(qing)況(kuang)下用悲(bei)觀鎖(suo)就(jiu)比較合適(shi)。
參考:
//www.hollischuang.com/archives/934
//blog.csdn.net/truelove12358/article/details/54963791
