最近在看《Java 並發編程實戰》,之前對所謂的線程的重排序一臉懵逼,今天終於有了點理解。
我們先來看下這個實例Demo
/** * 線程的重排序問題 * **/ public class PossibleReordering { static int x=0,y=0; static int a=0,b=0; public static void main(String[] args) throws InterruptedException { Thread oneThread=new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub a=1;// a=0---->1 x=b;// x=b=0 } }); Thread twoThread=new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub b=1;//b=1 y=a;//y=a=1 } }); oneThread.start(); twoThread.start(); oneThread.join(); twoThread.join(); /** * 如果不指定線程一和線程二的先后順序,結果會不可知 * 情況一: * 線程一先執行,線程二后執行 * x=0,y=0 * 情況二: * 線程二先執行, 線程一后執行 * x=0,y=0 * 情況三: * 線程一和線程二交替執行 * x=0,y=1 * 情況四: * x=1,y=1 * 情況五: * x=1,y=0
* 其他情況:
* ... * **/ System.out.println("x="+x+",y="+y); } }
在上面這個代碼中由於沒有指定線程一和線程二的先后順序,因此執行這段代碼后,會有一個神奇的現象。
執行后輸出結果可能是
x=0,y=1
但是過一小會再次執行就可能變成
x=1,y=0
這就是線程重排序的一個現象。
所謂的線程重排序用通俗易懂的話來說就是,線程一和線程二的執行先后順序在第一次執行和第二次執行后可能會重新排序。