国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

更多QQ空间微信QQ好友腾讯朋友复制链接
您的位置:首頁/技術文章
文章詳情頁

java - AQS中源碼疑問

【字号: 作者:豬豬瀏覽:128日期:2024-02-05 18:03:22

問題描述

在AbstractQueuedSynchronizer類中維護了一個用volatile修飾的state狀態,而這個狀態有如下的兩種修改方法:

state的set方法:

protected final void setState(int newState) { state = newState;}

CAS方法:

protected final boolean compareAndSetState(int expect, int update) { // See below for intrinsics setup to support this return unsafe.compareAndSwapInt(this, stateOffset, expect, update);}

那么,我的疑問來了,不是說volatile修飾的變量在多線程的單操作中,能夠保證其寫后讀的可見性,即能保證線程安全,為什么還提供了CAS操作能保證線程安全呢?還是我的理解有問題呢?謝謝各位大牛了!

問題解答

回答1:

并不沖突吧,setState只是一個寫操作,并沒有管原來的state,比如state原本是0,線程1和線程2分別讀取了這個值0,線程1把它set成1,然后線程2打算把它set成2,是可以成功的,盡管state已經是1了,而且線程2也知道,但是無所謂,線程2只是把它set成2。下面那個方法就不會了吧。

回答2:

是的,你的理解有問題。

不是說volatile修飾的變量在多線程的單操作中,能夠保證其寫后讀的可見性,即能保證線程安全

能夠保證可見性,不意味著可以保證線程安全。可見性跟線程安全不是同一個概念。

cas操作,可以劃分為幾個小操作

比較 expect 和 state 變量當前的值,如果相同,繼續2,如果不同,方法結束。

為 state 賦值 update

這兩個操作,如果是多線程并發調用,是會有線程安全問題的。這里的 cas 方法利用了 cpu 的 cas 指令,這個指令是原子操作。可以避免并發問題。

回答3:

簡而言之:

不依賴原始值的可以使用set

依賴原始值的可以使用cas去設置。本身這是個樂觀鎖。

標簽: java
相關文章:
主站蜘蛛池模板: 夜夜春夜夜夜夜猛噜噜噜噜噜 | 成人在线免费观看视频 | 午夜爽爽 | 久久精品视频亚洲 | 午夜亚洲国产成人不卡在线 | 一区二区伦理 | 欧美在线成人免费国产 | 131的美女午夜爱爱爽爽视频 | jiz欧美高清 | 亚洲精品系列 | 国产高清一级毛片在线不卡 | 午夜在线播放免费人成无 | 亚洲制服欧美自拍另类 | 欧美一级欧美一级在线播放 | 欧美一级久久久久久久大片 | 91香蕉国产线观看免 | 免费国产黄网站在线观看视频 | 亚洲精品一区二区不卡 | 欧美成人亚洲欧美成人 | 免费人成在线 | 亚洲视频精品 | 免费一级肉体全黄毛片 | 亚洲最大情网站在线观看 | 国产精品久久久久久搜索 | 欧美在线一区视频 | 日韩精品福利视频一区二区三区 | 国产边打电话边做对白刺激 | 久久久久久久久久免观看 | 一级毛片看一个 | 国产精品夜色视频一级区 | 日本男人天堂 | 99re在线视频精品 | pgone太大了兽王免费视频 | 国产高清一级毛片在线不卡 | 精品欧美一区视频在线观看 | 97在线碰碰观看免费高清 | 台湾三级香港三级在线理论 | 精品国产高清久久久久久小说 | 亚洲一区二区三区精品国产 | 国产高清免费视频 | 国产视频手机在线 |