jvm為優化執行效率對執行緒內的執行順序進行重排,對單執行緒來說執行指令重排並不會影響程式從上到下執行的**邏輯。但是在多執行緒的情況下,則可能會出現問題。
程式順序原則:乙個執行緒內保證語義的序列性
volatile規則:volatile變數的寫,先發生於讀
鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前
傳遞性:a先於b,b先於c 那麼a必然先於c
執行緒的start方法先於它的每乙個動作
執行緒的所有操作先於執行緒的終結(thread.join())
執行緒的中斷(interrupt())先於被中斷執行緒的**
物件的建構函式執行結束先於finalize()方法
3、**示例(實際演示中沒有演示出效果
package com.thread.study;
public class orderexample
public void read() }
public static void main(string args)});
//執行緒 b執行read方法
thread threadb = new thread(new runnable()});
threada.start();
threadb.start();}}
4、避免指令重排
指令重排是編譯器的一種優化手段,但是在多執行緒中可能會影響到**邏輯。如何避免指令重排可以通過同步的方式(效能問題)
package com.thread.study;
public class orderexample
public synchronized void read() }
public static void main(string args)});
//執行緒 b執行read方法
thread threadb = new thread(new runnable()});
threada.start();
threadb.start();}}
網上看到指令重排會對懶漢-單例模式有影響,後續分析。。。。 HappenBefore指令重排
你寫的 很可能根本沒按你期望的順序執行,因為編譯器和cpu會嘗試重排指令使得 更快地執行。在虛擬機器層面,為了盡可能減少記憶體操作速度遠慢於cpu執行速度所帶來的cpu空置的影響,虛擬機會按照自己的一些規則將程式編寫順序打亂 即寫在後面的 在時間順序上可能會先執行,而寫在前面的 會後執行 以盡可能充...
Volatile禁止指令重排
你寫的程式,計算機並不是按照你寫的那樣去執行的。源 編譯器優化的重排 指令並行可能會重排 記憶體系統可能會重排 執行 處理器在進行指令重排的時候,考慮,資料之間的依賴性!指令重排 不會造成影響的例子 int x 1 1int y 2 2x x 5 3y x x 4我們所期望的 1234 執行的時候可...
CPU指令重排序
cpu的速度至少比記憶體快100倍,為了提公升效率,會打亂原來的執行效率,會在一條指令執行過程中 比如去記憶體讀資料,大概慢100多倍 去同時執行另一條指令 前提是兩條指令沒有依賴關係 體現在 層面 就是,寫在後面的 可能比前面的 先執行。觀察下面 測試指令重排序 public class reor...