Open source are the greatest wealth---WANGPENG
          posts - 46, comments - 11, trackbacks - 0, articles - 0
             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          [轉(zhuǎn)載]Java的volatile是什么意思

          Posted on 2009-07-13 14:25 WANGPENG 閱讀(183) 評論(0)  編輯  收藏 所屬分類: Java
            我們知道,在Java中設置變量值的操作,除了long和double類型的變量外都是原子操作,也就是說,對于變量值的簡單讀寫操作沒有必要進行同步.

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

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

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

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

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

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

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

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

            由于使用volatile屏蔽掉了VM中必要的代碼優(yōu)化,所以在效率上比較低,因此一定在必要時才使用此關鍵字.
          主站蜘蛛池模板: 保山市| 巴彦淖尔市| 璧山县| 新昌县| 新田县| 鄂尔多斯市| 台山市| 武强县| 石渠县| 肥东县| 隆回县| 青海省| 勐海县| 鄯善县| 社旗县| 昌宁县| 奉节县| 韩城市| 全州县| 平远县| 凯里市| 云浮市| 安阳市| 会昌县| 上高县| 陈巴尔虎旗| 民勤县| 扎囊县| 綦江县| 保定市| 万盛区| 车致| 遂溪县| 屏边| 温州市| 连州市| 黄大仙区| 永康市| 平远县| 沾益县| 收藏|