java - MutableInteger 和 SynchronizedInteger 之间的区别?
问题描述
写了测试用例,希望加上synchronized关键字后输出会不一样。但是,当前输出的输出并不能体现同步的作用。我不知道出了什么问题?
第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();
}
}
可能的输出:输出1:
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
输出2:
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
输出3:
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();
}
}
可能的输出:输出1:
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
输出2:
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
输出3:
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
解决方案
推荐阅读
- python - 数据框列形状在安装到管道后反转,特别是在 kNearestNeighbor() 之后
- javascript - React Data Grid - 能够查看但不能编辑单元格
- python - 如何在 Python 中使用空值初始化对象?
- python - 使用 python 从investing.com 抓取数据
- php - 检查是否在wordpress中使用ajax发布多个点击事件
- r - R包括带有leafpop :: addpopupGraphs()的plot_ly()图
- julia - 升级 makie 包
- php - 带有限制记录的laravel分页
- google-sheets-formula - 谷歌表格拆分问题
- javascript - 在 TRX 文件中添加日志文件或失败截图