Rumah  >  Soal Jawab  >  teks badan

java - 线程同步为什么不一样

package com.dome;

public class Thread01 {

private volatile  static int a =10;
Thread td1 = new Thread(){
    
    public void run(){
        
        for(int i=0;i<3;i++){
            
                a = a+1;
            
            System.out.println(i+"td1:="+a);
        }
        
    }
    
};

Thread td2 = new Thread(){
    public void run(){
        
        for(int i=0;i<3;i++){
            a -=1;
            System.out.println(i+"td2:="+a);
        }
    }
    
};


public static void main(String[] args) {
    Thread01 th = new Thread01();
    th.td1.start();
    
    th.td2.start();
    
}

}

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

ringa_leeringa_lee2743 hari yang lalu471

membalas semua(1)saya akan balas

  • 迷茫

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

    Pernyataan seperti

    a = a + 1 dan a = a - 1 sebenarnya melibatkan tiga operasi: baca-ubah-tulis:

    1. Baca pembolehubah ke lokasi tertentu pada tindanan

    2. Tambah (tolak) 1 pada nilai pada kedudukan ini dalam tindanan

    3. Tulis nilai tambahan kembali ke lokasi storan yang sepadan dengan pembolehubah

    Jadi walaupun pembolehubah a diubah suai dengan volatile, ia tidak menjadikan a = a + 1 dan a = a - 1 terlibat dalam tiga operasi di atas sebagai atom. Untuk memastikan penyegerakan, anda perlu menggunakan 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();
    
        }
    }

    Hasil operasi tertentu:

    (Di mana td1 muncul, a ialah +1; apabila td2 muncul, a ialah -1)

    balas
    0
  • Batalbalas