java中關(guān)鍵字volatile的含義(轉(zhuǎn))

                  
                  在Java中設(shè)置變量值的操作,除了long和double類型的變量外都是原子操作,也就是說,對于變量值的簡單讀寫操作沒有必要進(jìn)行同步。

          這在JVM 1.2之前,Java的內(nèi)存模型實(shí)現(xiàn)總是從主存讀取變量,是不需要進(jìn)行特別的注意的。而隨著JVM的成熟和優(yōu)化,現(xiàn)在在多線程環(huán)境下volatile關(guān)鍵字的使用變得非常重要。

          在當(dāng)前的Java內(nèi)存模型下,線程可以把變量保存在本地內(nèi)存(比如機(jī)器的寄存器)中,而不是直接在主存中進(jìn)行讀寫。這就可能造成一個線程在主存中修改了一個變量的值,而另外一個線程還繼續(xù)使用它在寄存器中的變量值的拷貝,造成數(shù)據(jù)的不一致。

          要解決這個問題,只需要像在本程序中的這樣,把該變量聲明為volatile(不穩(wěn)定的)即可,這就指示JVM,這個變量是不穩(wěn)定的,每次使用它都到主存中進(jìn)行讀取。一般說來,多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志都應(yīng)該加volatile修飾。

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

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

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

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

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

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

          文章出處:DIY部落(http://www.diybl.com/course/3_program/java/javaxl/20090302/156333.html)


          同時查看下IBM中的詳細(xì)解釋:

          Java 理論與實(shí)踐: 正確使用 Volatile 變量

          http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

          posted on 2009-11-16 16:34 胡鵬 閱讀(358) 評論(0)  編輯  收藏 所屬分類: java基礎(chǔ)

          導(dǎo)航

          <2009年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統(tǒng)計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          agile

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 锡林郭勒盟| 齐齐哈尔市| 彩票| 三江| 肃宁县| 梁平县| 安岳县| 甘泉县| 且末县| 城固县| 连江县| 垣曲县| 东源县| 崇礼县| 红河县| 滦南县| 汶川县| 北辰区| 武邑县| 浦东新区| 石楼县| 宝丰县| 阳东县| 梁平县| 丽江市| 崇信县| 奉节县| 揭东县| 襄城县| 公主岭市| 华安县| 常山县| 呼图壁县| 嘉祥县| 东海县| 新巴尔虎右旗| 木里| 鄂州市| 宣武区| 毕节市| 赤城县|