Я написал тестовый пример и надеялся, что вывод будет другим после добавления синхронизированного ключевого слова.Однако выход токового выхода не отражает роль синхронизированного.Я не знаю, что пошло не так?
Глава 3 《Параллельность Java на практике》 3.1.1
//MutableInteger (Chapter3 《Java Concurrentcy in Practice》)
@NotThreadSafe
public class MutableInteger{
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public static void main(String[] args){
MutableInteger getAndset = new MutableInteger();
Thread setValue8 = new Thread(){
@Override
public void run() {
System.out.println("8: start set 8");
getAndset.setValue(8);
System.out.println("8: set 8 over and start get value ");
System.out.println( getAndset.getValue());
System.out.println("8: get value over");
}
};
Thread setValue10 = new Thread(){
@Override
public void run() {
System.out.println("10: start set 10");
getAndset.setValue(10);
System.out.println("10: set 10 over");
}
};
setValue8.start();
setValue10.start();
}
}
Возможный вывод: output1:
8: start set 8
10: start set 10
8: set 8 over and start get value
10: set 10 over
10
8: get value over
output2:
10: start set 10
8: start set 8
10: set 10 over
8: set 8 over and start get value
8
8: get value over
output3:
8: start set 8
8: set 8 over and start get value
8
8: get value over
10: start set 10
10: set 10 over
Класс SynchronizedInteger добавить синхронизированный
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
@ThreadSafe
public class SynchronizedInteger {
@GuardedBy("this") private int value;
public synchronized int getValue() {
return value;
}
public synchronized void setValue(int value) {
this.value = value;
}
public static void main(String[] args){
SynchronizedInteger getAndset = new SynchronizedInteger();
Thread setValue8 = new Thread(){
@Override
public void run() {
System.out.println("8: start set 8");
getAndset.setValue(8);
System.out.println("8: set 8 over and start get value ");
System.out.println( getAndset.getValue());
System.out.println("8: get value over");
}
};
Thread setValue10 = new Thread(){
@Override
public void run() {
System.out.println("10: start set 10");
getAndset.setValue(10);
System.out.println("10: set 10 over");
}
};
setValue8.start();
setValue10.start();
}
}
Возможный вывод: output1:
8: start set 8
8: set 8 over and start get value
8
8: get value over
10: start set 10
10: set 10 over
output2:
8: start set 8
8: set 8 over and start get value
8
8: get value over
10: start set 10
10: set 10 over
output3:
8: start set 8
10: start set 10
8: set 8 over and start get value
10: set 10 over
10
8: get value over