请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

使用countDownLatch的问题

CountDownLatch latch = new CountDownLatch(1);
        Thread one = new Thread(new Runnable() {
            @Override
            public void run() {

                a = 1;
                try {
                    latch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                x = b;
            }
        });
        Thread two = new Thread(new Runnable() {
            @Override
            public void run() {
                b = 1;
                try {
                    latch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                y = a;
            }
        });
        two.start();
        one.start();
        latch.countDown();
        one.join();
        two.join();

老师我改了latch.await();写的位置,这样不就意味着,a和b都已经被赋值1了然后被卡住,为什么还会出现1,0的情况

正在回答 回答被采纳积分+3

2回答

蒙奇D鸣人 2022-01-05 22:24:06

感觉有多种可能;main执行把countDown执行完了,2个子线程还没执行await方法,这样并发工具类无效,与没加一样,可能会出现1,0的情况;第二可能是可见性原因造成的;在第二个线程的local memory中a还是0;不知道这样理解对不对。

0 回复 有任何疑惑可以回复我~
  • 悟空 #1
    main执行把countDown执行完了,2个子线程还没执行await方法,这是有可能的
    回复 有任何疑惑可以回复我~ 2022-01-06 14:25:59
悟空 2021-11-25 19:13:01

latch初始化只有1,new CountDownLatch(1);

另外,需要完整代码,目前我不知道你打印的是什么,是a b还是 b a

0 回复 有任何疑惑可以回复我~
  • 提问者 慕工程9182859 #1
    打印的是x,y,我理解的是a,b都已经赋值1了,后续,x=b,y=a,xy的值不应该都是1吗
    回复 有任何疑惑可以回复我~ 2021-11-25 19:17:04
  • 悟空 回复 提问者 慕工程9182859 #2
    但是有可能在a=1之前,y就执行y=a了,所以y就不是1
    回复 有任何疑惑可以回复我~ 2021-11-27 22:04:39
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信