gpt4 book ai didi

java - 倒计时和进一步同步

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:42:05 26 4
gpt4 key购买 nike

假设我有以下类定义,当一个线程想要为多个(可能)等待的线程设置 a 时:

public class A {
    private int a;
    private CountDownLatch gate;

    public A(int a) {
        a = 1;
        gate = new CountDownLatch(1);
    }

    public int getA() {
        latch.await();
        return a;
    }

    public void setA(int a) {
        this.a = a;
        gate.countDown();
    }
}

在我看来,a 需要是易变的,但我不确定……有人可以分享为什么,如果有的话,为什么需要围绕 getA 进行额外的同步,或者 a 需要是易变的?

最佳答案

根据 the javadoc :

Until the count reaches zero, actions in a thread prior to calling countDown() happen-before actions following a successful return from a corresponding await() in another thread.

因此,如果您只调用一次 setA,则不需要额外的同步。如果您第二次调用它,因为计数已经为 0,您将无法获得相同的保证。

如果预期的用途是只调用 setA 一次,如果它被多次调用以执行该契约(Contract),您可能会抛出异常(尽管检查计数并为 atomically 分配一个新值可能如果没有额外的同步就很棘手)。

如果您很高兴 setA 可以被多次调用,那么您需要额外的同步。

关于java - 倒计时和进一步同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34764578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com