国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

淺析java volatitle 多線程問題

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

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

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

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

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

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

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

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

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

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 茌平县| 田东县| 尚义县| 老河口市| 益阳市| 姚安县| 嵊泗县| 新巴尔虎右旗| 丹棱县| 老河口市| 东阳市| 孟州市| 宽甸| 汤阴县| 南乐县| 揭西县| 南宁市| 翁牛特旗| 安泽县| 成都市| 温州市| 高邮市| 壶关县| 安顺市| 南靖县| 东宁县| 杭锦旗| 泗水县| 囊谦县| 北安市| 沛县| 苍山县| 龙口市| 昂仁县| 富阳市| 渭南市| 韶关市| 收藏| 邛崃市| 察隅县| 鹤庆县|