首页 > 编程语言 > 详细

Java常见编程错误:锁

时间:2020-04-25 22:54:21      阅读:76      评论:0      收藏:0      [点我收藏+]

分析解决线程安全问题的锁在使用中的问题。

场景:

在?个类?有两个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

 

Java常见编程错误:锁

原文:https://www.cnblogs.com/liekkas01/p/12775880.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!