包 com.dome;
公共類Thread01 {
雷雷}
0td1:=9
0td2:=9
1td1:=10
1td2:=9
2td1:=10
2td2:=9
迷茫2017-04-18 10:56:18
a = a + 1
, a = a - 1
這樣的語句,事實上涉及了 讀取-修改-寫入 三個運算:
讀取變數到堆疊中某個位置
對棧中該位置的值加 (減)1
將自增後的值寫回變數對應的儲存位置
因此雖然變數 a 使用 volatile
修饰,但并不能使涉及上面三个操作的 a = a + 1
,a = 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)