<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筆記 閱讀(380) 評論(0)  編輯  收藏 所屬分類: Java
     
    主站蜘蛛池模板: 暖暖日本免费中文字幕| 8090在线观看免费观看| 亚洲国产精品高清久久久| 99久久99久久精品免费观看| 亚洲人成网男女大片在线播放| 日本二区免费一片黄2019| 国产免费久久精品99久久| 亚洲欧洲精品视频在线观看| 国产一级淫片免费播放| 久久国产乱子伦精品免费强| 亚洲人成网站免费播放| 亚洲日韩人妻第一页| 免费国产黄网站在线观看可以下载| 亚洲av永久无码精品秋霞电影秋| 国产亚洲一区二区三区在线观看| 免费中文熟妇在线影片 | 亚洲一区二区三区免费| 亚洲人成电影网站| 亚洲无码日韩精品第一页| 亚洲免费人成视频观看| 亚洲一区二区三区免费| 亚洲午夜无码久久| 国产av无码专区亚洲av桃花庵| 黄网址在线永久免费观看 | 久久久亚洲欧洲日产国码农村| 成全影视免费观看大全二| 免费人成网站在线观看不卡| 久久亚洲精品无码网站| 亚洲第一页在线视频| 中文亚洲AV片在线观看不卡| 国产高清免费的视频| 91成年人免费视频| 日韩电影免费在线观看中文字幕 | 免费黄色电影在线观看| 国内成人精品亚洲日本语音| 亚洲熟妇av一区| 久久九九亚洲精品| 国产专区一va亚洲v天堂| 午夜一级免费视频| 在线观看免费人成视频色9| 一级毛片aaaaaa免费看|