少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任何時刻,
          兩個不同的線程總是看到某個成員變量的同一個值。
          
          Java語言規范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。
          
          這樣當多個線程同時與某個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。
          
          而volatile關鍵字就是提示VM:對于這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。
          
          使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者為常量時,不必使用。
          
          由于使用volatile屏蔽掉了VM中必要的代碼優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字。 
          
          
          就跟C中的一樣 禁止編譯器進行優化~~~~
          在并發中可保證內存一致性
          volatile聲明的變量只在主存中存儲
          讀取的時候,會有讀取臟數據的情況發生
          但是寫數據的時候,是能保證數據能正確寫入

          volatile只保證每次都從主存拿數據,其他保證不了什么吧?
          告訴編譯器不要使用緩存

          非long、double變量不能保證原子性,非volatile變量不能保證內存可見性。

          volatile 還能防止reorder...
          就是內存屏蔽,防止指令重拍
          其實目的就是保證可見性
          可以操作volatile...變量 但是不代表你的操作指令是原子的








          posted on 2012-10-18 10:38 abin 閱讀(344) 評論(0)  編輯  收藏 所屬分類: JavaMultithread
          主站蜘蛛池模板: 平邑县| 曲麻莱县| 新昌县| 建阳市| 固镇县| 延寿县| 文水县| 云安县| 宜州市| 花莲县| 平遥县| 延寿县| 平山县| 华池县| 平罗县| 龙川县| 隆昌县| 津市市| 靖西县| 通山县| 哈尔滨市| 阳新县| 抚远县| 元谋县| 深圳市| 太仆寺旗| 富蕴县| 汝阳县| 中卫市| 桦川县| 汶川县| 黔西| 芜湖市| 西华县| 财经| 阿拉善盟| 崇州市| 屯昌县| 玉林市| 鄂州市| 云阳县|