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

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

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

    posts - 310, comments - 6939, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Think in Java 4th--Java中的volatile

    Posted on 2007-09-11 14:31 詩特林 閱讀(1714) 評論(2)  編輯  收藏 所屬分類: Think In Java 4th
    Think in Java 4th--Java中的volatile

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

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

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

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

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

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

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

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

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

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

    請看如下示例:

     

     1package ch17_concurrency;
     2
     3
     4class UnresponsiveUI{
     5 private volatile double d=1;
     6 public UnresponsiveUI() throws Exception{
     7  while(d>0){
     8   d=d+(Math.PI+Math.E)/d;
     9  }

    10  System.in.read();
    11 }

    12}

    13
    14public class _19_ResponsiveUI extends Thread {
    15 private static volatile double d=1;
    16 public _19_ResponsiveUI(){
    17  setDaemon(true);
    18  start();
    19 }

    20 public void run(){
    21  while(true){
    22   //System.out.println(d);
    23   d=d+(Math.PI+Math.E)/d;
    24  }

    25 }

    26
    27 public static void main(String[] args) throws Exception {
    28  // TODO Auto-generated method stub
    29  //new UnresponsiveUI();
    30  new _19_ResponsiveUI();
    31  System.in.read();
    32  System.out.println(d);
    33 }

    34
    35}

    36

    評論

    # re: Think in Java 4th--Java中的volatile  回復  更多評論   

    2007-09-11 16:48 by dennis
    volatile需要強調的一點就是,它僅僅保證多線程環境下的可見性,不保證操作的原子性,舉的例子不大恰當吧,想更多了解還是看看這個帖子

    http://www.javaeye.com/topic/109150

    # re: Think in Java 4th--Java中的volatile[未登錄]  回復  更多評論   

    2008-05-23 14:26 by dd
    簡單點就是線程在運行的時候為了提高效率所以被允許偷一點點懶,即忽視多線程的可能,不更新主存中的原本(線程使用的值是副本)。

    VOLATILE即告訴JVM,不能偷懶!

    這個特性應該是從C移植過來的。而C是沒有線程的,所以說,JAVA的線程其實做得很勉強。

    因為從語義的角度講,線程的這種偷懶工作方式應該是不被允許的。JVM首先應該保證正確性(主存跟工作區的同步),然后再考慮性能優化。不正確的東西,性能再好也是白搭。



    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 在线观看免费为成年视频| 99在线精品视频观看免费| 国产在线观看免费完整版中文版 | 亚洲av无码专区亚洲av不卡 | 免费看AV毛片一区二区三区| 亚洲中文字幕无码mv| 精品久久久久久久免费人妻| 337P日本欧洲亚洲大胆精品| 亚洲国产香蕉人人爽成AV片久久| 人人公开免费超级碰碰碰视频| 亚洲国产精品不卡毛片a在线| 久久精品无码专区免费| 久久综合图区亚洲综合图区| 9277手机在线视频观看免费| 亚洲乱码日产精品BD在线观看| 最新中文字幕免费视频| 国产91成人精品亚洲精品| 亚洲无码视频在线| 国产精品免费看久久久 | 免费看一级高潮毛片| 久久国产成人亚洲精品影院 | 色www永久免费| 亚洲伊人久久大香线蕉啊 | 亚洲欧洲∨国产一区二区三区| 美女在线视频观看影院免费天天看 | 鲁丝片一区二区三区免费| 亚洲成aⅴ人在线观看| 日本一道高清不卡免费| 丝袜捆绑调教视频免费区| 亚洲成a人片毛片在线| 免费观看午夜在线欧差毛片| a视频在线观看免费| 亚洲sss综合天堂久久久| 亚洲高清成人一区二区三区| 国产情侣久久久久aⅴ免费| 亚洲国产精品免费观看 | 亚洲精品线在线观看| 日本不卡在线观看免费v| 97无码人妻福利免费公开在线视频| 亚洲人成777在线播放| 日韩一卡2卡3卡4卡新区亚洲|