更新時(shí)間:2020年12月08日17時(shí)01分 來源:傳智教育 瀏覽次數(shù):
Synchronized顯然是一個(gè)悲觀鎖,因?yàn)樗牟l(fā)策略是觀的:不管是否會(huì)產(chǎn)生競爭,任何的數(shù)據(jù)操作都必須要加鎖、用戶態(tài)核心態(tài)轉(zhuǎn)換、維護(hù)鎖計(jì)數(shù)器和檢査是否有被阻塞的線程需要被喚醒等操作。隨著硬件指令集的發(fā)展,我們可以使用基于沖突檢測的樂觀并發(fā)策略。先進(jìn)行操作,如果沒有其他線程征用數(shù)據(jù),那操作就成功了;如果共享數(shù)據(jù)有征用,產(chǎn)生了沖突,那就再進(jìn)行其他的補(bǔ)償措施。這種樂觀的并發(fā)策略的許多實(shí)現(xiàn)不需要線程掛起,所以被稱為非阻塞同步。
樂觀鎖的核心算法是CAS( Comparand Swap,比較并交換),它涉及到三個(gè)操作數(shù):內(nèi)存值、預(yù)期值、新值。當(dāng)且僅當(dāng)預(yù)期值和內(nèi)存值相等時(shí)才將內(nèi)存值修改為新值。
這樣處理的邏輯是,首先檢查某塊內(nèi)存的值是否跟之前我讀取時(shí)的一樣,如不一樣則表示期間此內(nèi)存值已經(jīng)被別的線程更改過,舍棄本次操作,否則說明期間沒有其他線程對(duì)此內(nèi)存值操作,可以把新值設(shè)置給此塊內(nèi)存CAS具有原子性,它的原子性由CPU硬件指令實(shí)現(xiàn)保證,即使用JNI調(diào)用Native方法調(diào)用由C++編寫的硬件級(jí)別指令,JDK中提供了Unsafe類執(zhí)行這些操作。
猜你喜歡:
Spring AOP實(shí)現(xiàn)原理和常見代理的區(qū)別
下面是傳智教育公開的幾套Java課程,您可以下載和在線觀看學(xué)習(xí),如果想深入學(xué)習(xí)java并想找到不錯(cuò)的java開發(fā)相關(guān)工作,建議報(bào)班學(xué)習(xí)傳智教育Java高級(jí)軟件工程師課程。獲取【Java視頻教程+資料】加播妞:435946716。
北京校區(qū)