<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筆記 閱讀(381) 評論(0)  編輯  收藏 所屬分類: Java
     
    主站蜘蛛池模板: 亚洲Av永久无码精品黑人| 精品无码国产污污污免费网站国产| 女人18毛片水真多免费播放| 美女扒开屁股让男人桶爽免费| 国产午夜亚洲精品午夜鲁丝片| 97在线视频免费播放| 亚洲hairy多毛pics大全| 亚洲精品无码av人在线观看| 国产va精品免费观看| www.av在线免费观看| 亚洲理论精品午夜电影| 亚洲成A人片在线观看中文| 日韩精品无码专区免费播放| 欧美亚洲精品一区二区| 亚洲人成在线播放网站岛国| 亚洲AV无码不卡在线观看下载| 99热这里只有精品6免费| 成人婷婷网色偷偷亚洲男人的天堂| 亚洲国产精品无码久久一区二区| 69成人免费视频无码专区| 永久免费av无码网站yy| 麻豆亚洲AV成人无码久久精品| 久久精品国产亚洲AV无码偷窥| 免费a级毛片永久免费| 国产免费的野战视频| 国内精品免费久久影院| 亚洲欧美日韩中文字幕在线一区 | 免费二级毛片免费完整视频| 91精品国产免费入口| 国产成人高清精品免费观看| 亚洲精品无码人妻无码| 亚洲综合免费视频| 亚洲综合网站色欲色欲| 国产精品免费视频网站| 成人免费一级毛片在线播放视频| 国产偷伦视频免费观看| 一级做性色a爰片久久毛片免费| 亚洲日韩一区精品射精| 亚洲午夜国产精品| 亚洲视频在线视频| 人人狠狠综合久久亚洲88|