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

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

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

    在路上

    路上有驚慌,路上有理想

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      28 Posts :: 1 Stories :: 10 Comments :: 0 Trackbacks

    Java 內存模型

    JVM系統中存在一個主內存(Main Memory),Java中所有變量都儲存在主存中,對于所有線程都是共享的。每條線程都有自己的工作內存(Working Memory),工作內存中保存的是主存中某些變量的拷貝,線程對所有變量的操作都是在工作內存中進行,線程之間無法相互直接訪問,變量傳遞均需要通過主存完成。

    模型的規則:

    1.原子性:保證程序得到成員變量(非局部變量)的值或者是初始值,又或者是某線程修改后的,絕對不是多個線程混亂修改后的。

    2.可見性(共享內存的數據):什么情況下,寫入成員變量的值對讀取該變量的值是可見的?

         A.寫操作釋放了同步鎖,讀操作獲得了同步鎖

               原理:釋放鎖的時候強制線程把所使用的工作內存中的值刷新到主存,獲得鎖的時候從主存重新裝載值。

               p.s.鎖只被同步塊和方法中的操作占有,但卻控制了執行該操作的線程的所有成員變量。

         B.如果一個成員變量為volatile,那么在寫線程做存儲操作前,寫入這個成員變量的數據會在主存中刷新,并對其他線程可見。讀線程每次使用這個成員變量前都要重新從主存讀數據。

         C.如果一個線程訪問一個對象的成員變量,讀到的值為初始值或者另一個線程修改后的值。

            p.s. 不要對引用未完全創建好的對象。

                   如果一個類可以被子類化,那么在構造函數里啟動一個線程是非常危險的

         D.當一個線程結束后,所有的寫入數據都會被刷新到主存。

              p.s.同一個線程的不同方法之間傳遞對象的引用,永遠不會有可見性問題

       存儲模型保證:如果上面的操作都會發生,那么一個線程對一個成員變量的更新最終對另一個線程是可見的。

    3.順序化(內存操作的順序):什么情況下,一個線程的操作可以是無序的?順序化的問題主要圍繞和讀寫有關的賦值語句的執行順序。

       如果采用同步機制,那不用多說,順序化可以保證。

       當沒有同步機制時,存儲模型所做的保證是難以相信的。在多線程環境下,存儲模型是難以保證一定正確的。

      只有當滿足下面的三個原則,順序化才得以保證。

       A.從線程執行方法的角度看,如果指令都是串行執行的,那么順序可以保證

       B.保證同步方法或塊的順序執行

       C.使用volatile定義成員變量

    線程執行過程中,存儲模型與鎖的關系:

    (1) 獲取對象的鎖

    (2) 清空工作內存數據, 從主存復制變量到當前工作內存, 即同步數據

    (3) 執行代碼,改變共享變量值

    (4) 將工作內存數據刷回主存

    (5) 釋放對象的鎖

    最后介紹一下volatile關鍵字

         volatile定義的成員變量可以保證可見性和順序化,但不保證原子性。比如count++。
         *比如把一個變量聲明為volatile,并不能保證這個變量引用的非volatile數據的可見性。比如volatile string[10](數組)

         正確使用volatile的前提條件

         a.對變量的寫操作不依賴于當前值

         b.不要和其他成員變量遵守不變約束。見*處的解釋

        volatile的應用

         a.狀態標志

            volatile boolean shutdownFlag;

           public void shutdown() { shutdownFlag= true; }
           public void doWork() {
           while (!shutdownFlag) {
            // do something
             }

         b.假設一個后臺線程可能會每隔幾秒讀取一次數據庫里的合同金額,并更新至 volatile 變量。然后,其他線程可以讀取這個變量,從而隨時能夠看到最新的金額。 比較廣泛應用在統計類的系統中。

    參考文檔:

    http://www.cs.umd.edu/~pugh/java/memoryModel/

    http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

    《Java并發編程:設計原則與模式》

    posted on 2010-11-03 17:56 阮步兵 閱讀(1453) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: a毛片免费全部在线播放**| 亚洲视频在线观看免费| 亚洲成在人线aⅴ免费毛片| 色播亚洲视频在线观看| 日韩精品无码免费一区二区三区| 亚洲不卡中文字幕无码| 亚洲精品美女视频| 久久青草免费91观看| 亚洲视频在线一区二区三区| 免费在线观看h片| 亚洲日韩精品无码专区 | 亚洲日韩一区精品射精| 扒开双腿猛进入爽爽免费视频 | 在线看片无码永久免费视频| 亚洲中文字幕乱码AV波多JI| 三年片在线观看免费观看高清电影 | 久久www免费人成精品香蕉| 国产亚洲精品美女久久久| 伊人久久免费视频| 亚洲乱码一二三四区乱码| 国产乱子伦精品免费无码专区| 羞羞视频免费网站入口| 亚洲成在人线av| 一二三四在线播放免费观看中文版视频 | 国产亚洲美女精品久久久2020 | 久久免费美女视频| 亚洲国产精品免费在线观看| 性感美女视频在线观看免费精品| 综合偷自拍亚洲乱中文字幕| 亚洲精品一级无码中文字幕| 亚洲乱妇熟女爽到高潮的片| 亚洲乱亚洲乱少妇无码| 99在线观看精品免费99| 怡红院亚洲红怡院在线观看| 亚洲无av在线中文字幕| 国产h视频在线观看免费| 九九九精品视频免费| 亚洲无圣光一区二区| 亚洲 综合 国产 欧洲 丝袜 | 亚洲综合精品一二三区在线| 日韩成人免费视频播放|