搜尋

首頁  >  問答  >  主體

java - 執行緒同步為什麼不一樣

包 com.dome;

公共類Thread01 {

雷雷

}

0td1:=9
0td2:=9
1td1:=10
1td2:=9
2td1:=10
2td2:=9

ringa_leeringa_lee2813 天前500

全部回覆(1)我來回復

  • 迷茫

    迷茫2017-04-18 10:56:18

    a = a + 1a = a - 1 這樣的語句,事實上涉及了 讀取-修改-寫入 三個運算:

    1. 讀取變數到堆疊中某個位置

    2. 對棧中該位置的值加 (減)1

    3. 將自增後的值寫回變數對應的儲存位置

    因此雖然變數 a 使用 volatile 修饰,但并不能使涉及上面三个操作的 a = a + 1a = a - 1具有原子性。为了保证同步性,需要使用 synchronized

    public class Thread01 {
    
        private volatile static int a = 10;
    
        Thread td1 = new Thread() {
    
            public void run() {
    
                for (int i = 0; i < 3; i++) {
                    synchronized (Thread01.class) {
                        a = a + 1;
                        System.out.println(i + "td1:=" + a);
                    }
                }
            }
    
        };
    
        Thread td2 = new Thread() {
            public void run() {
    
                for (int i = 0; i < 3; i++) {
                    synchronized (Thread01.class) {
                        a -= 1;
                        System.out.println(i + "td2:=" + a);
                    }
                }
            }
    
        };
    
        public static void main(String[] args) {
            Thread01 th = new Thread01();
            th.td1.start();
    
            th.td2.start();
    
        }
    }

    某次運行結果:

    (td1 出現的地方,a 就 +1;td2 出現的地方,a 就 -1)

    回覆
    0
  • 取消回覆