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

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

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

    Raymond
    Java筆記

    Volatile Fields

    Sometimes, it seems excessive to pay the cost of synchronization just to read or write an instance field or two. After all, what can go wrong? Unfortunately, with modern processors and compilers, there is plenty of room for error:

    • Computers with multiple processors can temporarily hold memory values in registers or local memory caches. As a consequence, threads running in different processors may see different values for the same memory location!

    • Compilers can reorder instructions for maximum throughput. Compilers won't choose an ordering that changes the meaning of the code, but they make the assumption that memory values are only changed when there are explicit instructions in the code. However, a memory value can be changed by another thread!

    If you use locks to protect code that can be accessed by multiple threads, then you won't have these problems. Compilers are required to respect locks by flushing local caches as necessary and not inappropriately reordering instructions. The details are explained in the Java Memory Model and Thread Specification developed by JSR 133 (see http://www.jcp.org/en/jsr/detail?id=133). Much of the specification is highly complex and technical, but the document also contains a number of clearly explained examples. A more accessible overview article by Brian Goetz is available at http://www-106.ibm.com/developerworks/java/library/j-jtp02244.html.

    NOTE

    Brian Goetz coined the following "synchronization motto": "If you write a variable which may next be read by another thread, or you read a variable which may have last been written by another thread, you must use synchronization."


    The volatile keyword offers a lock-free mechanism for synchronizing access to an instance field. If you declare a field as volatile, then the compiler and the virtual machine take into account that the field may be concurrently updated by another thread.

    For example, suppose an object has a boolean flag done that is set by one thread and queried by another thread. You have two choices:

    1. Use a lock, for example:

      public synchronized boolean isDone() { return done; }
      private boolean done;
      

      (This approach has a potential drawback: the isDone method can block if another thread has locked the object.)

    2. Declare the field as volatile:

      public boolean isDone() { return done; }
      private volatile boolean done;
      

    Of course, accessing a volatile variable will be slower than accessing a regular variablethat is the price to pay for thread safety.

    NOTE

    Prior to JDK 5.0, the semantics of volatile were rather permissive. The language designers attempted to give implementors leeway in optimizing the performance of code that uses volatile fields. However, the old specification was so complex that implementors didn't always follow it, and it allowed confusing and undesirable behavior, such as immutable objects that weren't truly immutable.


    In summary, concurrent access to a field is safe in these three conditions:

    • The field is volatile.

    • The field is final, and it is accessed after the constructor has completed.

    • The field access is protected by a lock.

    posted on 2006-02-19 15:58 Raymond的Java筆記 閱讀(388) 評論(0)  編輯  收藏 所屬分類: Java
     
    主站蜘蛛池模板: 亚洲色偷精品一区二区三区| 毛片基地免费观看| 国产裸模视频免费区无码| 亚洲精品无码久久毛片波多野吉衣| 精品人妻系列无码人妻免费视频| 日本免费的一级v一片| 亚洲中文字幕久久无码| 免费国产高清视频| 老司机午夜在线视频免费| 国产精品久久香蕉免费播放| 国产精品免费一区二区三区| 亚洲精品无码你懂的网站| 成年网站免费入口在线观看 | 在线免费观看污网站| 国产亚洲精品VA片在线播放| 成人黄页网站免费观看大全| 亚洲中文字幕无码亚洲成A人片| 亚洲毛片网址在线观看中文字幕| 3344免费播放观看视频| 国产在线19禁免费观看国产| 国产免费人成视频在线播放播| 无人在线观看免费高清视频| 亚洲人成网站在线在线观看| 免费视频中文字幕| 大桥未久亚洲无av码在线| 久操视频免费观看| 在线观看免费成人| 免费看一区二区三区四区 | 亚洲色大成网站www尤物| 中文字幕中韩乱码亚洲大片| 无码囯产精品一区二区免费 | 亚洲国产日韩在线| 最近免费中文字幕大全| a毛片久久免费观看| 成人午夜性A级毛片免费| 亚洲高清无在码在线电影不卡| 中文字幕无码免费久久99| 99麻豆久久久国产精品免费| 国产成人亚洲精品电影| 亚洲国产一二三精品无码| 4hu四虎最新免费地址|