亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

java - AQS中源碼疑問

瀏覽:119日期: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
相關文章:
主站蜘蛛池模板: 麻豆传媒官方入口 | 欧美日韩亚洲视频 | 色婷婷久久 | 免费啪视频一区二区三区 | 精品亚洲视频在线观看 | 久草在线视频福利资源站 | 色综合综合在线 | 91精品麻豆| 中文字幕日韩精品一区口 | 韩国一级做a爱性色毛片 | 99视频精品免视3 | 精精国产www视频在线观看免费 | yy一级毛片免费视频 | 美国一级毛片在线观看 | 国产欧美日韩精品高清二区综合区 | 午夜精品在线观看 | 四虎永久免费地址ww 41.6 | 日本精品一区二区三本中文 | 好属妞这里只有精品久久 | 一及黄色片 | 日本视频二区 | 成年人的毛片 | 国产4p露脸在线观看 | 114一级毛片免费 | m3u8久久国产精品影院 | 国产高清视频在线 | 伊人影院99 | 黄页网站 播放器 日本 | 国产一级免费在线观看 | 国产成人免费片在线观看 | 亚久久伊人精品青青草原2020 | 亚洲婷婷国产精品电影人久久 | 成人福利在线视频 | 68日本xxxxxxx18| 男生j桶进女人p又色又爽又黄 | 久久久精品在线观看 | 欧美性视频一区二区三区 | 欧美国产日韩做一线 | 亚洲国产精品免费视频 | 国内自拍tv在线 | 涩色婷婷狠狠第四四房社区奇米 |