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

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

Java原子變量類常見問題解決

瀏覽:4日期:2022-09-04 15:02:54

在學習多線程時,遇到了原子變量類,它是基于 CAS 和 volatile 實現的,能夠保障對共享變量進行 read-modify-write 更新操作的原子性和可見性。于是我就寫了一段代碼試試,自認為非常正確。

public class Test{ private static AtomicInteger ID = new AtomicInteger(0); public static int nextID(){ //返回的ID范圍為 1~100 if(ID.get() == 100) { //ID到達100時,則從1開始 ID.set(1); return ID.get(); // return ID = 1; } else return ID.incrementAndGet(); //++ID } public static void main(String[] args) throws Exception{ for(int i = 0; i < 5; i++){ new Thread(()->{for(int j = 0; j < 100; j++) nextID(); }).start(); } Thread.sleep(1000); //應該輸出100才對 System.out.println(ID); }}

用五個線程并發獲得ID,每個線程獲取100個,最后應該輸出100才是,但試了好幾次都不是100。原子變量類不是能保障原子性和可見性嗎,為什么出現了競態?

糾結了很久,還是很懵逼。后來發現 get 方法相當于讀取一個 volatile 變量,而讀取一個 volatile 變量時,不具備排他性?。ˋtomicInteger類內部使用了volatile修飾了value值,而volatile關鍵字不具備排他性)

也就是說,當一個線程剛讀取到了共享的 volatile 變量的值時,其他線程可會馬上對共享變量進行修改。如,線程A讀取到ID的值為99時(還沒對ID進行修改),其他線程可能馬上就將ID加1了,此時共享變量為100了,其他線程再獲取ID時,應該令ID=1才是,但線程A已經進入了else分支,它還認為ID=99,而不知道其他線程剛把ID加1變成了100,所以會吧ID加上1變成了101,這就出現了競態。

《Java多線程編程實戰指南 - 核心篇》中,作者說:“可見性的保障僅僅意味著一個線程能夠讀取到共享變量的相對新值,而不能保障該線程能讀取到相應變量的最新值”。如volatile對可見性的保障就是保障的相對新值,由于volatile不具備排他性,所以有可能讀線程剛讀到一個相對新值,寫線程就更改了共享變量,此時,讀線程剛剛讀取到的相對新值就不是最新的了。

作者對相對新值和最新值的定義:

對于同一個共享變量而言,一個線程更新了該變量的值之后,其他線程能夠讀取到這個更新后的值,那這個值就被稱為該變量的 相對新值。

如果讀取這個共享變量的線程在讀取并使用該變量的時候其他線程無法更新該變量的值,那么該線程讀取到的相對新值就被稱為該變量的 最新值。需要加鎖,才能讀取到最新值。

解決辦法,使用原子操作 compareAndSet:

private static int nextID(){ //返回的ID范圍為 1~100 ID.compareAndSet(100, 0); return ID.incrementAndGet();}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 国产亚洲一区二区精品张柏芝 | 大陆一级毛片免费视频观看 | 国产美女网 | www.好色.com| 免费看在线爱爱小视频 | 黄色美国 | 国产精品嫩草影院99av视频 | 国产色综合一区二区三区 | 视频办公室添的我好爽 | 亚1洲二区三区四区免费 | 亚洲国产精品婷婷久久久久 | 女人被免费视频网站 | 日本级毛片免费观看 | 日韩美女一级毛片a | 欧美一区二区三区不卡视频 | 日本特黄特黄刺激大片 | 色天天综合网色鬼综合 | 国产高清一级视频在线观看 | 国产自产v一区二区三区c | 国产女乱淫真高清免费视频 | 国产亚洲女在线线精品 | 亚洲综合图区 | 日韩免费高清视频网站 | 色爱综合区五月小说 | 黄色一级视频免费观看 | 国产精品永久免费视频 | 久久99国产精品久久99果冻传媒 | 久久亚洲精品中文字幕二区 | 国产在线日韩在线 | 亚洲国产高清视频在线观看 | 国产福利视频一区二区微拍视频 | 曰曰啪天天拍视频在线 | 成人免费福利网站在线看 | 国产色秀视频在线观看 | 免费麻豆国产一区二区三区四区 | 久久精品嫩草影院 | 九九色在线视频 | 在线免费观看网站 | 成人免费黄色片 | 婷婷久久激情啪啪 | 久久精品国产亚洲网站 |