Java記憶體模型FAQ(四)重排序意味著什麼?
在很多情況下,訪問一個程式變數(物件例項欄位,類靜態欄位和陣列元素)可能會使用不同的順序執行,而不是程式語義所指定的順序執行。編譯器能夠自由的以優化的名義去改變指令順序。在特定的環境下,處理器可能會次序顛倒的執行指令。資料可能在暫存器,處理器緩衝區和主記憶體中以不同的次序移動,而不是按照程式指定的順序。
例如,如果一個執行緒寫入值到欄位a,然後寫入值到欄位b,而且b的值不依賴於a的值,那麼,處理器就能夠自由的調整它們的執行順序,而且緩衝區能夠在a之前重新整理b的值到主記憶體。有許多潛在的重排序的來源,例如編譯器,JIT以及緩衝區。
編譯器,執行時和硬體被期望一起協力建立好像是順序執行的語義的假象,這意味著在單執行緒的程式中,程式應該是不能夠觀察到重排序的影響的。但是,重排序在沒有正確同步了的多執行緒程式中開始起作用,在這些多執行緒程式中,一個執行緒能夠觀察到其他執行緒的影響,也可能檢測到其他執行緒將會以一種不同於程式語義所規定的執行順序來訪問變數。
大部分情況下,一個執行緒不會關注其他執行緒正在做什麼,但是當它需要關注的時候,這時候就需要同步了。
《Java記憶體模型FAQ(一) 什麼是記憶體模型》
原文
What is meant by reordering?
There are a number of cases in which accesses to program variables (object instance fields, class static fields, and array elements) may appear to execute in a different order than was specified by the program. The compiler is free to take liberties with the ordering of instructions in the name of optimization. Processors may execute instructions out of order under certain circumstances. Data may be moved between registers, processor caches, and main memory in different order than specified by the program.
For example, if a thread writes to field a and then to field b, and the value of b does not depend on the value of a, then the compiler is free to reorder these operations, and the cache is free to flush b to main memory before a. There are a number of potential sources of reordering, such as the compiler, the JIT, and the cache.
The compiler, runtime, and hardware are supposed to conspire to create the illusion of as-if-serial semantics, which means that in a single-threaded program, the program should not be able to observe the effects of reorderings. However, reorderings can come into play in incorrectly synchronized multithreaded programs, where one thread is able to observe the effects of other threads, and may be able to detect that variable accesses become visible to other threads in a different order than executed or specified in the program.
Most of the time, one thread doesn’t care what the other is doing. But when it does, that’s what synchronization is for.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2845376/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java記憶體模型FAQ(一) 什麼是記憶體模型Java記憶體模型
- Java記憶體模型FAQ(五)舊的記憶體模型有什麼問題?Java記憶體模型
- Java記憶體模型FAQ(三)JSR133是什麼?Java記憶體模型JS
- Java記憶體模型FAQ(十)volatile是幹什麼用的Java記憶體模型
- Java記憶體模型FAQ(七)同步會幹些什麼呢Java記憶體模型
- Java記憶體模型是什麼,為什麼要有Java記憶體模型,Java記憶體模型解決了什麼問題?Java記憶體模型
- java記憶體模型——重排序Java記憶體模型排序
- 什麼是Java記憶體模型?Java記憶體模型
- 什麼是Java記憶體模型Java記憶體模型
- Java記憶體模型FAQ(六)沒有正確同步的含義是什麼?Java記憶體模型
- Java記憶體模型FAQ(二) 其他語言,像C++,也有記憶體模型嗎?Java記憶體模型C++
- Java記憶體模型FAQ(九)在新的Java記憶體模型中,final欄位是如何工作的Java記憶體模型
- 什麼是Java記憶體模型(JMM)中的主記憶體和本地記憶體?Java記憶體模型
- 深入理解Java記憶體模型(二)——重排序Java記憶體模型排序
- 面試官:為什麼需要Java記憶體模型?面試Java記憶體模型
- 【死磕Java併發】-----Java記憶體模型之重排序Java記憶體模型排序
- java 記憶體模型-03-快取和重排序Java記憶體模型快取排序
- Java記憶體模型Java記憶體模型
- Java 記憶體模型Java記憶體模型
- JVM記憶體結構、Java記憶體模型和Java物件模型JVM記憶體Java模型物件
- 第三章 Java記憶體模型之重排序④Java記憶體模型排序
- 你瞭解Java記憶體模型麼(Java7、8、9記憶體模型的區別)Java記憶體模型
- Java記憶體模型FAQ(八)Final欄位如何改變它們的值Java記憶體模型
- Java記憶體區域和記憶體模型Java記憶體模型
- Java的記憶體模型Java記憶體模型
- JMM Java 記憶體模型Java記憶體模型
- Java物件記憶體模型Java物件記憶體模型
- Java記憶體模型-(1)Java記憶體模型
- 探索Java記憶體模型Java記憶體模型
- 理解Java記憶體模型Java記憶體模型
- 程式的記憶體四區模型記憶體模型
- 淺談JVM記憶體結構 和 Java記憶體模型 和 Java物件模型JVM記憶體Java模型物件
- Java記憶體模型簡介Java記憶體模型
- Java記憶體模型 - 簡介Java記憶體模型
- 淺談Java記憶體模型Java記憶體模型
- Java記憶體模型之前奏Java記憶體模型
- Concurrency(五: Java記憶體模型)Java記憶體模型
- 深入淺出Java記憶體模型Java記憶體模型