对方正在学习 2019-03-21 17:44 采纳率: 0%
浏览 398

问一个并发问题,synchronized关键字未能保证线程代码块同步

synchronized关键字未能够保证线程同步
首先,我的测试代码如下:

package test;

public class CommenTest {

    public static Integer a = 10;

    public static void main(String[] args) {
        Runnable run = (() -> {
            for (int i = 0; i < 1000000; i++) {
                synchronized (a) {
                    a++;
                    System.out.println(a);
                }
            }
        });

        Thread thread1 = new Thread(run);
        Thread thread2 = new Thread(run);

        thread1.start();
        thread2.start();

        System.out.println(a);
    }

}

然后,我在第9行和第23行这里打断点,使得程序停止,接着我选中线程1和线程2然后点击Resume按钮让这两个线程同时开始执行,并执行完毕,如下图
图片说明
最后我发现结果并不是预期的2000010,而是一个比这要小的数字,而且多次执行基本没有一次是正确结果,如下图
图片说明
不知道这是什么原因,希望帮忙解答一下

  • 写回答

4条回答 默认 最新

  • 可爱的小书包 2019-03-21 18:30
    关注

    因为这里的a是在变化的值,你的锁都发生变化了,当然就锁不住了。关键是在-128-127之间,Integer都是会做缓存的

    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示