麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

淺析java volatitle 多線程問題

2019-11-26 16:00:24
字體:
來源:轉載
供稿:網友

我們知道,在Java中設置變量值的操作,除了long和double類型的變量外都是原子操作,也就是說,對于變量值的簡單讀寫操作沒有必要進行同步。

這在JVM 1.2之前,Java的內存模型實現總是從主存讀取變量,是不需要進行特別的注意的。而隨著JVM的成熟和優化,現在在多線程環境下volatile關鍵字的使用變得非常重要。在當前的Java內存模型下,線程可以把變量保存在本地內存(比如機器的寄存器)中,而不是直接在主存中進行讀寫。這就可能造成一個線程在主存中修改了一個變量的值,而另外一個線程還繼續使用它在寄存器中的變量值的拷貝,造成數據的不一致。要解決這個問題,只需要像在本程序中的這樣,把該變量聲明為volatile(不穩定的)即可,這就指示JVM,這個變量是不穩定的,每次使用它都到主存中進行讀取。一般說
來,多任務環境下各任務間共享的標志都應該加volatile修飾。

Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。

Java語言規范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。

這樣當多個線程同時與某個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。

而volatile關鍵字就是提示VM:對于這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。

使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者為常量時,不必使用。

由于使用volatile屏蔽掉了VM中必要的代碼優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字。

在虛擬機的實現中,int,char等基本類型為一個字長。而long和double占兩個字長。在某些虛擬機的實現中,兩個字長可能會被作為兩個原子性的單字長來操作。

如果不以volatile修飾long和double,如果多線程訪問該變量,由于long操作的整體非原子性而導致結果混亂。
比如:int,一個線程寫入4,另一個寫入5. 最后肯定是4或者5.而 long型,可能就是個亂七八糟的數值了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 免费毛片免费看 | 一区二区三区欧洲 | 国产羞羞视频在线观看免费应用 | 萌白酱福利视频在线网站 | 国产一级www | 亚洲射情 | 久久精品久久精品久久精品 | 成人在线视频在线观看 | 午夜精品福利影院 | 99国产精品白浆在线观看免费 | 一级一片免费看 | 亚洲成人国产综合 | 羞羞视频免费观看入口 | 久久精品.com | free korean xxxxhd| 好吊色欧美一区二区三区四区 | 国产精品久久久久久久不卡 | 成人综合一区二区 | 成人毛片100部 | 免费欧美精品 | 看黄在线观看 | 久久久久一区二区三区四区五区 | 久久久久久久黄色片 | 免费国产一级特黄久久 | 黑人一区| vidz 98hd| 国产亚洲精品久久久久久大师 | 国产精品一区在线观看 | 亚洲第五色综合网 | 欧美成年人在线视频 | 失禁高潮抽搐喷水h | 日美av在线 | 午夜爽爽爽男女免费观看hd | 免费一级毛片在线播放不收费 | 7777久久香蕉成人影院 | 久久一区三区 | 日韩.www | 欧美亚洲啪啪 | 黄视频在线网站 | 国产亚洲精品综合一区91 | hdjapanesemassagehd日本 |