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

您的位置:首頁技術(shù)文章
文章詳情頁

java - AQS中源碼疑問

瀏覽:164日期:2024-02-05 18:03:22

問題描述

在AbstractQueuedSynchronizer類中維護(hù)了一個(gè)用volatile修飾的state狀態(tài),而這個(gè)狀態(tài)有如下的兩種修改方法:

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只是一個(gè)寫操作,并沒有管原來的state,比如state原本是0,線程1和線程2分別讀取了這個(gè)值0,線程1把它set成1,然后線程2打算把它set成2,是可以成功的,盡管state已經(jīng)是1了,而且線程2也知道,但是無所謂,線程2只是把它set成2。下面那個(gè)方法就不會了吧。

回答2:

是的,你的理解有問題。

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

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

cas操作,可以劃分為幾個(gè)小操作

比較 expect 和 state 變量當(dāng)前的值,如果相同,繼續(xù)2,如果不同,方法結(jié)束。

為 state 賦值 update

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

回答3:

簡而言之:

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

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

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 一级黄色片aaa | 久久久久久久国产a∨ | 免费在线观看一区 | a一级毛片免费高清在线 | 欧美牲| 欧美成人在线视频 | 国产一级免费视频 | 精品日本亚洲一区二区三区 | 九草视频在线 | 亚洲高清视频免费 | 亚洲国产欧美在线不卡中文 | 一区二区中文字幕在线观看 | 亚洲国产一区二区三区a毛片 | 精品综合在线 | 亚洲加勒比久久88色综合1 | 日韩成人在线观看视频 | 国产在线观看xxxx免费 | 国产菲菲视频在线观看 | 日韩精品一区二区三区四区 | 亚洲成人一级片 | 2021精品国产品免费观看 | 亚洲在线成人 | 老司机精品影院一区二区三区 | 国产在线播放成人免费 | 热久久在线观看 | 亚洲国产成人精品一区91 | 一区二区在线播放福利视频 | 日本免费高清视频二区 | 视频精品一区二区三区 | 久久免费看视频 | 日韩精品在线一区 | 波多野结衣一区二区三区在线观看 | 日本苍井一级毛片 | 永久网站色视频在线观看免费 | 国产精品久久毛片 | 欧美野外性xxxxfeexxxxx | 美女黄色影院 | 欧美成人亚洲国产精品 | 国产在线不卡午夜精品2021 | 久久久久久久亚洲精品一区 | 毛片一区二区三区 |