synchronized內部代碼是否保證有序性

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內部代碼依然會指令重排序

但因爲剛接觸多線程編程,我也不能很確定這種模擬與推斷是否正確,歡迎大家討論,歡迎大牛來指點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章