分析解决线程安全问题的锁在使用中的问题。
在?个类?有两个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