package jvmtest4;
public class Main { private static int temp; private static volatile boolean flag; public static void main(String[] args) { temp = 0;flag = false; new Thread(new Runnable() { @Override public void run() { for (int i =0; i < 1000000; i++) { synchronized (Main.class) { flag = false; temp = 0; temp = 1; flag = true; } } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i =0; i < 1000000; i++) { if (flag){ synchronized (Lock.class){ if (temp == 0) System.out.println("NONONONONONO"); } } } } }).start(); } }
package jvmtest4; public class Lock { }
剛開始接觸多線程編程,遇到一個問題,找不到答案。
synchronized內部代碼是否保證有序性?
我們都知道進出鎖住的代碼塊是串行的,因爲只能有一個線程拿到鎖,這就使得使用同一個鎖的兩個執行過程A和B之間,A看B的操作是有序的,B看A的操作也是有序的,是因爲執行過程內部無論會不會指令重排序,結果都是一致的。
但問題是,被鎖住的執行過程,內部會不會指令重排序?
爲求答案,我想到了模擬以上代碼的場景,根據結果,我的推斷是:synchronized內部代碼依然會指令重排序
但因爲剛接觸多線程編程,我也不能很確定這種模擬與推斷是否正確,歡迎大家討論,歡迎大牛來指點