<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    [轉載]Java的volatile是什么意思

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

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

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

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

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

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

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

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

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

      由于使用volatile屏蔽掉了VM中必要的代碼優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字.
    主站蜘蛛池模板: 日本不卡免费新一区二区三区| 精品亚洲视频在线| 国产成人AV免费观看| 亚洲国产精品一区二区三区久久| 国产精品亚洲专区无码牛牛| 精品免费国产一区二区| 亚洲欧美日韩中文字幕一区二区三区| 中文字幕人成无码免费视频| 亚洲 欧洲 日韩 综合在线| 女人18毛片免费观看| 亚洲丁香婷婷综合久久| 免费又黄又爽的视频| 中文字幕免费在线看线人动作大片| 国产亚洲成归v人片在线观看| 男女午夜24式免费视频| 亚洲国产综合第一精品小说| 91嫩草国产在线观看免费| 国产精品亚洲综合天堂夜夜| 久久亚洲2019中文字幕| 日韩精品内射视频免费观看| 亚洲av永久无码精品天堂久久| 女人18毛片免费观看| 久久国产精品免费| 亚洲高清无在码在线电影不卡| 成人免费午夜视频| 久久成人永久免费播放| 亚洲国产成人久久99精品| 免费无码又爽又刺激高潮| 日韩在线视频线视频免费网站| 亚洲国产综合精品中文第一区| 扒开双腿猛进入爽爽免费视频| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 久久国产免费观看精品3| 国产91在线|亚洲| 亚洲国产小视频精品久久久三级 | 黄页网站在线视频免费| 亚洲国产成人久久综合一| 四色在线精品免费观看| 中文无码成人免费视频在线观看| 中文日韩亚洲欧美制服| 中文字幕亚洲不卡在线亚瑟|