<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ## java內存模型 ![](https://img.kancloud.cn/93/74/93745502f796d301067e393655147067_562x362.png) 主內存 * 主要存儲變量(包括。實例字段,靜態字段和構成對象的元素) * 對應Java內存中的堆 工作內存 * 每個線程都有自己的工作內存,存儲了對應的引用,方法參數。 * 對應Java虛擬機的棧 ## 八種原子操作 ![](https://img.kancloud.cn/39/c0/39c0667c421349a4216442775a0ac342_742x582.png) ### 從主內存的讀取數據到線程的私有內存中 * unlock:作用于主內存的變量。它把一個處于鎖定狀態的變量釋放出來,釋放后的變量才能被其他線程訪問。 * read:作用于主內存的變量(跨讀)。它把一個變量的值從主內存傳輸到線程的工作內存中,以便隨后的load動作使用。 * load:作用于工作內存的變量(寫)。它把read操作從主內存中得到的變量值放入到工作內存變量副本中。 * use:作用于工作內存的變量。它把工作內存中一個變量的值傳遞給執行引擎,每當虛擬機遇到一個\*\*需要使用到變量的值的字節碼指令時(代碼的讀值操作)\*\*會執行這個操作。 ### 從線程的私有內存數據同步到主內存中 * assign:作用于工作內存的變量。它把一個從執行引擎收到的值賦給工作內存的變量,每當虛擬機遇到\*\*給變量賦值的字節碼指令時(代碼的賦值操作)\*\*會執行這個操作 * store:作用于工作內存的變量(跨讀)。它把工作內存中一個變量值傳送到主內存中。以便隨后的write操作。 * write:作用于主內存的變量(寫)。它把store操作從工作內存中得到的變量的值,放入主內存的變量中 * lock:作用于主內存的變量。它把一個變量標識為一條線程獨占的狀態 java為了**保證數據在****單線程****情形下傳輸過程中的準確性與數據一致性**,規定了內存之間交互的一些操作規則 * 一個新的變量只能在主內存中誕生,工作內存要使用或者賦值。必須要經過load或assign操作。 * 不允許read和load、store和write操作之一單獨出現。即不允許一個變量從主內存讀取了但工作內存不接受。或者從工作內存發起回寫了但主內存不接受的情況 * 不允許一個線程丟棄它的最近的assign操作。即變量在工作內存改變了后必須把該變化同步到主內存中。 * 不允許沒有發生任何的assign操作就把數據同步到主內存中。 * 一個變量在同一時刻只允許一條線程進行lock操作,但lock操作可以被同一線程重復執行多次,多次執行lock后,只有執行相同次數的unlock操作,變量才會被解鎖。 * 如果對一個變量進行lock操作后,那將會清空工作內存中此變量的值,在執行引擎使用這個變量前,需要重新執行load或assign操作。 * 如果一個變量事先沒有被lock操作鎖定,那就不允許對它進行unlock操作。也不允許去unlock一個被其他線程鎖定的變量。 * 對一個變量執行unLock操作之前,必須要把次變量同步到主內存中(執行store,write操作) ## Happens-Before 原則 編譯器、處理器都會對代碼進行重排序,如果讓程序員再去了解這些底層的實現以及具體規則,那么程序員的負擔就太重了,嚴重影響了并發編程的效率。 因此,JMM可以通過happens-before關系向程序員提供跨線程的內存可見性保證(如果A線程的寫操作a與B線程的讀操作b之間存在happens-before關系,盡管a操作和b操作在不同的線程中執行,但JMM向程序員保證a操作將對b操作可見) 具體的一共有六項規則: * 程序順序規則:一個線程中的每個操作,happens-before于該線程中的任意后續操作。 * 監視器鎖規則:對一個鎖的解鎖,happens-before于隨后對這個鎖的加鎖。 * volatile變量規則:對一個volatile域的寫,happens-before于任意后續對這個volatile域的讀。 * 傳遞性:如果A happens-before B,且B happens-before C,那么A happens-before C。 * start()規則:如果線程A執行操作ThreadB.start()(啟動線程B),那么A線程的ThreadB.start()操作happens-before于線程B中的任意操作。 * join()規則:如果線程A執行操作ThreadB.join()并成功返回,那么線程B中的任意操作happens-before于線程A從ThreadB.join()操作成功返回。 * 程序中斷規則:對線程interrupted()方法的調用先行于被中斷線程的代碼檢測到中斷時間的發生。 * 對象finalize規則:一個對象的初始化完成(構造函數執行結束)先行于發生它的finalize()方法的開始。 ## 參考資料 [Java并發編程:JAVA的內存模型](https://blog.csdn.net/fei20121106/article/details/83186171)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看