<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
     
    主站蜘蛛池模板: 日韩电影免费在线观看网址| 香蕉蕉亚亚洲aav综合| 亚洲人成自拍网站在线观看| 亚洲免费在线观看视频| 亚洲va久久久噜噜噜久久狠狠| 一级做a免费视频观看网站| 国产美女做a免费视频软件| 亚洲欧美不卡高清在线| 妞干网免费视频在线观看| 伊人久久五月丁香综合中文亚洲| 一二三四在线播放免费观看中文版视频| 亚洲电影在线播放| 成人黄色免费网址| 亚洲依依成人亚洲社区| 国产精品免费看香蕉| 日本特黄特色AAA大片免费| 在线亚洲午夜理论AV大片| 好久久免费视频高清| 亚洲精品福利网站| 青娱乐免费在线视频| 亚洲av日韩精品久久久久久a| 免费真实播放国产乱子伦| 成人免费观看男女羞羞视频| 亚洲香蕉网久久综合影视| 三年片在线观看免费观看大全动漫| 亚洲欧洲日产v特级毛片| 成年女人18级毛片毛片免费| 色噜噜狠狠色综合免费视频| 在线观看午夜亚洲一区| 无码国产精品一区二区免费vr| tom影院亚洲国产一区二区| 国产免费资源高清小视频在线观看| www永久免费视频| 亚洲视频在线观看免费视频| 免费观看男人免费桶女人视频 | 亚洲中文字幕无码日韩| 99热在线精品免费播放6| 亚洲色成人网站WWW永久四虎 | 成人精品视频99在线观看免费| 亚洲精品视频在线| 好爽又高潮了毛片免费下载|