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
a = a + 1
、a = a - 1
このようなステートメントには、実際には読み取り、変更、書き込みの 3 つの操作が含まれます。
<オル>
a = a + 1
, a = a - 1
这样的语句,事实上涉及了 读取-修改-写入 三个操作:
读取变量到栈中某个位置
对栈中该位置的值进行加 (减)1
将自增后的值写回到变量对应的存储位置
因此虽然变量 a 使用 volatile
修饰,但并不能使涉及上面三个操作的 a = a + 1
,a = a - 1
具有原子性。为了保证同步性,需要使用 synchronized
スタック上の特定の場所に変数を読み取ります
スタック内のこの位置の値に 1 を加算 (減算) します
volatile
で変更されていますが、上記の 3 つが関係する a = a + 1
、a = a - 1
にはなりません。操作 > アトミックであること。同期を確実にするには、synchronized
を使用する必要があります:
リーリー
特定の操作の結果: 🎜🎜🎜
🎜(td1 が出現する場合、a は +1、td2 が出現する場合、a は -1)🎜