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

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

java - AtomicInteger 的CAS 問題

【字号: 作者:豬豬瀏覽:83日期:2023-10-23 11:55:57

問題描述

public final int incrementAndGet() {for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next))return next;} }

這是自增操作,定義: CAS有3個(gè)操作數(shù),內(nèi)存值V,舊的預(yù)期值A(chǔ),要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時(shí),將內(nèi)存值V修改為B,否則什么都不做預(yù)期值是next嗎? 內(nèi)存值是current?假如1個(gè)線程自增時(shí)沒有其他線程競爭,那么預(yù)期值應(yīng)該比內(nèi)存值大1啊,怎么會預(yù)期值和內(nèi)存值相同?

問題解答

回答1:

瀉藥~可能題主這里理解有點(diǎn)偏差

current是預(yù)期值,不是內(nèi)存值

next是修改的新值不是預(yù)期值

方法compareAndSet的源碼就可以看得出來,里面注釋已經(jīng)很明白了

/** * Atomically sets the value to the given updated value * if the current value {@code ==} the expected value. * * @param expect the expected value * @param update the new value * @return {@code true} if successful. False return indicates that * the actual value was not equal to the expected value. */ public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }

CAS的操作是按照題主所說,用預(yù)期值和內(nèi)存值比較,只有當(dāng)相等時(shí),才會把新值寫入,否則會不斷重試,是一種樂觀的態(tài)度,而真正的內(nèi)存值其實(shí)是AtomicInteger.value這個(gè)屬性(其實(shí)最關(guān)鍵也不是這個(gè)屬性,只是個(gè)引用而已,真正的boss后面會提到),注意這個(gè)value的有關(guān)鍵字volatile修飾

private volatile int value;

所以這個(gè)value值其實(shí)是一個(gè)共享變量,代表著這個(gè)變量的可見性,也就是線程之間的可見性,

=======================話多隨便扯了哈可見性,不喜可以直接略過================================

簡單點(diǎn)說,Java內(nèi)存模型規(guī)定了變量是存在主存中(類似物理內(nèi)存)的,各個(gè)線程都有自己的工作緩存,在對某個(gè)變量操作時(shí),不是直接修改主存中的值,而是在自己的工作緩存中執(zhí)行,最后在同步到主存中,并且線程相互之間的是不能訪問對方的工作緩存的

這里說到的可見性,就是指,線程在操作有關(guān)鍵字volatile修飾的變量時(shí),當(dāng)成功修改了這個(gè)變量并寫入了主存,那么其他線程的工作緩存中的變量會失效,所以此時(shí)其他線程再次去讀取變量時(shí)會直接從主存中去讀,而不會再用自己工作緩存中的值了

==========================================扯完==============================================

剛才說到AtomicInteger.value這個(gè)屬性對于數(shù)據(jù)本身而言,只是一個(gè)引用,在調(diào)用compareAndSet方法時(shí),可以注意到第二個(gè)參數(shù),valueOffset,其實(shí)這才是關(guān)鍵...真正的Boss,真正的內(nèi)存的值,因?yàn)樯婕暗皆趈ava語言里很少聽到的一個(gè)詞,指針,這個(gè)valueOffset其實(shí)就是對象內(nèi)的偏移量啦,這才是真正的內(nèi)存值

(之所以這個(gè)方法compareAndSet里調(diào)用的是Unsafe類的方法,Unsafe這其實(shí)就是封裝了一些類似指針的操作,指針才不安全嘛)

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 国产精品亚洲成在人线 | 成人影院一区二区三区 | 国产欧美日韩亚洲精品区2345 | 美女张开腿让男人桶爽免费网站 | 国产亚洲精品久久麻豆 | 久久久久免费视频 | 日韩成人黄色片 | 中文字幕成人 | 欧美成人精品一级高清片 | 免费看一片 | 爽爽爽爽爽爽a成人免费视频 | 日本加勒比在线播放 | 夜色毛片永久免费 | 色综合久久91| 男女视频免费观看 | 国产美女精品视频 | 久久精品免视着国产成人 | 欧美日韩亚洲一区二区三区在线观看 | avav在线看 | 97精品国产高清在线看入口 | 久久久久欧美精品观看 | 天堂视频免费看 | 97久久精品国产精品青草 | 一本久久精品一区二区 | 亚洲精品欧美精品 | 久久国产精品久久精 | 久久福利精品 | 日韩 欧美 自拍 在线 视频 | 成人免费视频网站 | 欧美一区亚洲二区 | 一本久久道久久爱 | 欧美性妇 | 依依成人综合网 | 亚洲人成在线播放网站岛国 | 亚洲一区 欧美 | 福利社在线 | 高清毛片一区二区三区 | 欧美一级特黄aaaaaa在线看首页 | 成年片免费网址网站 | 国产精选在线播放 | 99精品视频免费观看 |