java - Cas操作會(huì)加鎖嗎
問(wèn)題描述
問(wèn)題:(1)不需要cas操作來(lái)加鎖和解鎖,這個(gè)怎么理解??cas操作不是如果比較不成功那么就一直嘗試嗎?和加鎖有什么關(guān)系??這個(gè)該如何理解
問(wèn)題解答
回答1:compare and swap操作不一定不需要鎖,看平臺(tái),但是大多數(shù)平臺(tái)都是支持無(wú)鎖cas的。最簡(jiǎn)單的鎖是通過(guò)test and set實(shí)現(xiàn)的自旋鎖,當(dāng)然通過(guò)cas也可以實(shí)現(xiàn)。
自旋鎖在上鎖失敗時(shí)的確會(huì)不斷嘗試,耗盡cpu資源。如
while (flag.test_and_set()) { /* yield; */ } // 上鎖flag.clear(); // 解鎖
系統(tǒng)接口提供的鎖,上鎖失敗時(shí)一般會(huì)掛起線程,類似
while (flag.test_and_set()) { flag.wait_for_unlock_signal(); } // 上鎖
這里的wait_for_unlock_signal()是個(gè)假想函數(shù)。但是上鎖依然依賴類似cas的原子操作。也就是說(shuō),現(xiàn)在鎖都是通過(guò)一些基本的原子操作來(lái)實(shí)現(xiàn)的,如test and set和compare and swap。
相關(guān)文章:
1. javascript - 關(guān)于apply()與call()的問(wèn)題2. java - 在用戶不登錄的情況下,用戶如何添加保存到購(gòu)物車?3. javascript - nginx反向代理靜態(tài)資源403錯(cuò)誤?4. java - spring boot 如何打包成asp.net core 那種獨(dú)立應(yīng)用?5. docker網(wǎng)絡(luò)端口映射,沒(méi)有方便點(diǎn)的操作方法么?6. 安全性測(cè)試 - nodejs中如何防m(xù)ySQL注入7. docker - 各位電腦上有多少個(gè)容器啊?容器一多,自己都搞混了,咋辦呢?8. 推薦好用mysql管理工具?for mac和pc9. Mysql 組合索引最左原則的疑惑10. javascript - 如何將函數(shù)計(jì)算出的內(nèi)容傳遞為變量
