色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

java - AQS中源碼疑問

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

問題描述

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

回答2:

是的,你的理解有問題。

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

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

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

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

為 state 賦值 update

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

回答3:

簡而言之:

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

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

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 99久久综合给久久精品 | 69成人做爰视频69 | 国产成人综合一区精品 | 久久成人福利视频 | 亚洲风情第一页 | 宅男66lu国产乱在线观看 | 成人国产精品免费视频不卡 | 精品久久久久久久高清 | 美女把张开腿男生猛戳免费视频 | 亚洲免费人成在线视频观看 | 成人国产欧美精品一区二区 | julia中文字幕久久亚洲 | 操美国女人 | 精品国产视频在线观看 | 91原创视频在线观看 | 欧美日韩一级二级三级 | 亚洲成人在线视频网站 | 一本色道久久88加勒比—综合 | 久久综合久久久久 | 精品国产品国语在线不卡丶 | 日韩欧美视频一区二区在线观看 | 欧美成人亚洲欧美成人 | 欧美aaa级| 国产色爽女小说免费看 | 男人躁女人躁的好爽免费视频 | 日本韩国三级在线观看 | 成人午夜影院 | 杨幂国产精品福利在线观看 | 国产精品久久久久久久久久一区 | 国产一久久香蕉国产线看观看 | 69xx欧美| 久久久久久久99久久久毒国产 | 黄色美女免费网站 | 欧美性色大片 | 久久香蕉国产线看免费 | 中文字幕亚洲在线 | 国产末成年女噜噜片 | 国产精品免费_区二区三区观看 | 成年日韩片av在线网站 | 亚洲自偷自偷图片在线高清 | 日产一区两区三区 |