網(wǎng)站如何做導(dǎo)航條下拉菜單收錄入口在線提交
1. 前言
本節(jié)內(nèi)容主要是對(duì) Java 樂(lè)觀鎖與悲觀鎖進(jìn)行更加深入的講解,本節(jié)內(nèi)容更加偏重于對(duì)樂(lè)觀鎖的講解,因?yàn)?synchronized 悲觀鎖對(duì)于大部分學(xué)習(xí)者并不陌生,本節(jié)主要內(nèi)容如下:
- 樂(lè)觀鎖與悲觀鎖的概念,之前有所講解,這里用很小的篇幅進(jìn)行知識(shí)的回顧,鞏固;
- 樂(lè)觀鎖與悲觀鎖的使用場(chǎng)景介紹,通過(guò)理解悲觀鎖與樂(lè)觀鎖不同的風(fēng)格,理解什么場(chǎng)景下需要選擇合適的鎖,為本節(jié)的重點(diǎn)內(nèi)容之一;
- 了解樂(lè)觀鎖的缺點(diǎn),樂(lè)觀鎖有自己的特定的缺陷,不同的鎖都有自己的優(yōu)點(diǎn)與缺點(diǎn);
- 了解樂(lè)觀鎖缺陷的解決方式,作為本節(jié)內(nèi)容的重點(diǎn)之一;
- 通過(guò)引入 Atomic 操作,實(shí)現(xiàn)樂(lè)觀鎖,為本節(jié)內(nèi)容的核心,通過(guò)對(duì)比 synchronized 的實(shí)現(xiàn),用兩種鎖機(jī)制實(shí)現(xiàn)同一個(gè)需求。
本節(jié)內(nèi)容為 CAS 原理的進(jìn)階講解,也是樂(lè)觀鎖與悲觀鎖的深入講解。因?yàn)閷?duì)于并發(fā)編程,悲觀鎖與樂(lè)觀鎖的涉及頻率非常高,所以對(duì)其進(jìn)行更加深入的講解。
2. 樂(lè)觀鎖與悲觀鎖的概念
悲觀鎖:總是假設(shè)最壞的情況,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣其他線程想拿這個(gè)數(shù)據(jù)就會(huì)阻塞直到它拿到鎖(共享資源每次只給一個(gè)線程使用,其它線程阻塞,用完后再把資源轉(zhuǎn)讓給其它線程)。
樂(lè)觀鎖:總是假設(shè)最好的情況,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒(méi)有去更新這個(gè)數(shù)據(jù),可以使用版本號(hào)機(jī)制和 CAS 算法實(shí)現(xiàn)。
樂(lè)觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量,像數(shù)據(jù)庫(kù)提供的類似于 write_condition 機(jī)制,其實(shí)都是提供的樂(lè)觀鎖。
3. 樂(lè)觀鎖與悲觀鎖的使用場(chǎng)景
簡(jiǎn)單的來(lái)說(shuō) CAS 適用于寫比較少的情況下(多讀場(chǎng)景,沖突一般較少),synchronized 適用于寫比較多的情況下(多寫場(chǎng)景,沖突一般較多)。
- 對(duì)于資源競(jìng)爭(zhēng)較少(線程沖突較輕)的情況,使用 synchronized 同步鎖進(jìn)行線程阻塞和喚醒切換以及用戶態(tài)內(nèi)核態(tài)間的切換操作額外浪費(fèi)消耗 CPU 資源;而 CAS 基于硬件實(shí)現(xiàn),不需要進(jìn)入內(nèi)核,不需要切換線程,