Rumah > Soal Jawab > teks badan
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
迷茫2017-04-18 10:56:18
Pernyataan seperti
a = a + 1
dan a = a - 1
sebenarnya melibatkan tiga operasi: baca-ubah-tulis:
Baca pembolehubah ke lokasi tertentu pada tindanan
Tambah (tolak) 1 pada nilai pada kedudukan ini dalam tindanan
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)