分析解决线程安全问题的锁在使用中的问题。
在?个类?有两个int类型的字段a和b,有?个add?法循环1万次对a和b进 ?++操作,有另?个compare?法,同样循环1万次判断a是否?于b,条件成?就打印a和b的值,并判断 a>b是否成?。
代码如下:
volatile int a = 1;
volatile int b = 1;
int loop=10000000;
public void add() {
System.out.println("add start");
for (int i = 0; i < loop; i++) {
a++;
b++;
}
System.out.println("add done");
}
public void compare() {
System.out.println("compare start");
for (int i = 0; i < loop; i++) {
//a始终等于b吗?
if (a < b) {
System.out.println(a + "," + b + "," + (a > b));
//最后的a>b应该始终是false吗?
}
}
System.out.println("compare done");
}
public static void main(String[] args) {
LockTest test = new LockTest();
new Thread(() -> test.add()).start();
new Thread(() -> test.compare()).start();
}
按道理,a和b同样进?累加操作,应该始终相等,compare中的第?次判断应该始终不会成?,不会输出任何?志。但,执?代码后发现不但输出了?志,?且更诡异的是,compare?法在判断a<b成?的情况下还输出了a>b也成?:
9899491,9899492,false 9899949,9899950,true 9900959,9900959,false 9901787,9901786,true
原文:https://www.cnblogs.com/liekkas01/p/12775880.html