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
과 같은 문에는 실제로 세 가지 작업이 포함됩니다. 읽기-수정-쓰기:
스택의 특정 위치로 변수 읽기
스택의 이 위치에 있는 값에 1을 더(빼기)
증분된 값을 변수에 해당하는 저장 위치에 다시 씁니다
따라서 변수 a가 volatile
으로 수정되더라도 위의 세 가지 작업에 관련된 a = a + 1
및 a = a - 1
이 원자적으로 만들어지지는 않습니다. 동기화를 보장하려면 synchronized
:
특정 작업의 결과:
(td1이 나타나는 경우 a는 +1이고, td2가 나타나는 경우 a는 -1입니다.)