使用countDownLatch的问题

来源:12-6 重排序1

慕工程9182859

2021-11-25

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的情况

写回答

2回答

蒙奇D鸣人

2022-01-05

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

0
1
悟空
main执行把countDown执行完了,2个子线程还没执行await方法,这是有可能的
2022-01-06
共1条回复

悟空

2021-11-25

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

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

0
2
悟空
回复
慕工程9182859
但是有可能在a=1之前,y就执行y=a了,所以y就不是1
2021-11-27
共2条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程