gpt4 book ai didi

java - 调用者阻塞直到 getFoo() 准备好一个值?

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:16 26 4
gpt4 key购买 nike

我有一个 Java Thread,它公开了其他线程想要访问的属性:

class MyThread extends Thread {
private Foo foo;
...
Foo getFoo() {
return foo;
}
...
public void run() {
...
foo = makeTheFoo();
...
}
}

问题是从运行到 foo 可用需要很短的时间。调用者可以在此之前调用 getFoo() 并获得一个 null。我宁愿他们只是阻塞、等待,并在初始化发生后获取值。 (foo 之后永远不会改变。)准备就绪只需几毫秒,所以我对这种方法很满意。

现在,我可以使用 wait()notifyAll() 来实现这一点,而且我有 95% 的机会做对。但我想知道你们会怎么做; java.util.concurrent 中是否有一个原语可以执行此操作,我错过了?

或者,您将如何构建它?是的,使 foo 易变。是的,在内部锁 Object 上同步并将检查放在 while 循环中,直到它不是 null。我错过了什么吗?

最佳答案

如果 foo 只初始化一次,一个 CountDownLatch非常适合。

class MyThread extends Thread {

private final CountDownLatch latch = new CountDownLatch(1);

...

Foo getFoo() throws InterruptedException
{
latch.await(); /* Or use overload with timeout parameter. */
return foo;
}

@Override
public void run() {
foo = makeTheFoo()
latch.countDown();
}

}

闩锁提供与 volatile 关键字相同的可见性行为,这意味着读取线程将看到线程分配的 foo 的值,即使 foo 未声明为 volatile

关于java - 调用者阻塞直到 getFoo() 准备好一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2837136/

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