<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] Java內存模型規范(JSR-133)是圍繞原子性、可見性和有序性展開的。 ## 原子性、可見性、有序性 ![](https://img.kancloud.cn/b8/aa/b8aa875f8d9cb647fcfbb7d67c927f5b_1472x652.png) 如下圖說明了Java線程、工作內存和主存之前的關系。 ![](https://img.kancloud.cn/d8/ce/d8ce0de964d06a7b79cdd903bb70b5d6_1278x860.png) Java內存模型(JMM)定義了一套自己的主存到工作內存之間的交互協議,即一個變量如何從主存拷貝到工作內存,又如何從工作內存寫入主存,該協議包含8種操作,并且要求JVM具體實現必須保證其中每一種操作都是原子的、不可再分的。 8種操作分別是: ![](https://img.kancloud.cn/ba/94/ba949c07584b4381c9814142dc8c1a4e_1174x570.png) 如下圖描述了以上8個操作所在位置: ![](https://img.kancloud.cn/8a/e7/8ae7e83cd040c1240eaa14eb1dc39aae_1088x724.png) ## 什么是指令重排,為什么需要? 要搞懂指令重排,首先要知道一條指令在CPU內是如何執行的,如下圖約5個步驟。 ![](https://img.kancloud.cn/22/a2/22a2fb26c288e7b1c0dcf393b6d269ee_1478x380.png) 為了加快指令并行速度,CPU硬件支持了流水線技術。 ![](https://img.kancloud.cn/e1/4b/e14baa9d4e47e34564da5c11ed450819_1472x518.png) 不同的指令步驟執行在不同的硬件局部,從而可以支持同時并發執行。 ![](https://img.kancloud.cn/1e/b0/1eb023edfbc07ca797b53fd55cd54530_1344x1000.png) 知道了CPU流水線之后,我們來看一個A=B+C的流水線執行過程例子: ![](https://img.kancloud.cn/79/b1/79b136d144d4a8dddf48e555d9b671ec_1474x716.png) 如果按串行排列,則耗時4 * 5 = 20個時鐘周期;使用CPU流水線并行技術后,可以只消耗9個時鐘周期,節省了11個時鐘周期的時間。所以流水線技術的引入,大大提高了CPU并行執行速度。 再看如下圖的例子: ![](https://img.kancloud.cn/19/a3/19a300dea893de502710a8f75741b603_1466x1664.png) 多條語句執行時,通過指令重排(CPU指令級重排序)可以消除一些CPU中斷,從而縮短執行時間,加快執行速度。 ## 重排序 ![](https://img.kancloud.cn/5e/cd/5ecd7cbd67907995e866859bda6cf9bd_1612x392.png) 對于Java語言來說,為了提高新能,從源碼到得到指令執行序列可能會經過編譯器重排序和CPU重排序;CPU重排序又分為指令級重排和內存系統重排。 ### 編譯器重排序 編譯器重排序指的是在代碼編譯階段進行指令重排,不改變程序執行結果的情況下,為了提升效率,編譯器對指令進行亂序(Out-of-Order)的編譯。 ### CPU重排序 流水線(Pipeline)和亂序執行(Out-of-Order Execution)是現代CPU基本都具有的特性。 所謂“亂序”,僅僅是被稱為“亂序”,實際上也遵循著一定規則:只要兩個指令之間不存在“數據依賴”,就可以對這兩個指令亂序。 CPU重排序包括兩類:指令級重排序和內存系統重排序。 * 指令級重排序 在不影響程序執行結果的情況下,CPU內核采用ILP(Instruction-Level Parallelism,指令級并行運算)技術來將多條指令重疊執行,主要是為了提升效率。如果指令之間不存在數據依賴性,CPU就可以改變語句的對應機器指令的執行順序,叫作指令級重排序。 * 內存系統重排序 對于現代的CPU來說,在CPU內核和主存之間都具備一個高速緩存,高速緩存的作用主要是減少CPU內核和主存的交互(CPU內核的處理速度要快得多),在CPU內核進行讀操作時,如果緩存沒有的話就從主存取,而對于寫操作都是先寫在緩存中,最后再一次性寫入主存。 由于處理器使用緩存和讀/寫緩沖區,這使得加載和存儲操作看上去可能是在亂序執行。 ## 哪些指令不能重排:Happen-Before原則(先行發生) ![](https://img.kancloud.cn/f8/26/f8269f3faba8dee43fbf5a6302ac1588_1472x1036.png) ## 參考文檔 * 書籍:葛一鳴 *《Java高并發程序設計第二版》 * 書籍:周志明 *《深入理解Java虛擬機》
                  <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>

                              哎呀哎呀视频在线观看