gpt4 book ai didi

java - 这个对象在监听器中修改是线程安全的吗?

转载 作者:行者123 更新时间:2023-11-30 02:03:26 25 4
gpt4 key购买 nike

在下面的代码片段中,假设有两个线程从结果读取/写入。当eventListener线程写入results时,被阻塞的线程是否能够访问最新的结果?如果没有,什么实用程序( volatile AtomicReference)会有帮助?

private Object doStuff() {

CountDownLatch latch = new CountDownLatch( 1 );
Object[] results = new Object[1];

EventObjectListener eventListener = ( String topic, Object eventObject ) -> {
results[0] = eventObject;
latch.countDown();
};

eventReceiver.addEventListener( eventListener );

doThingThatGeneratesEvent();

int waitMagnitude = 10;
TimeUnit waitUnit = TimeUnit.SECONDS;
try {
latch.await( waitMagnitude, waitUnit );
} catch ( InterruptedException e ) {
return null;
} finally {
eventReceiver.removeEventListener( eventListener );
}

return results[0];
}

最佳答案

是的,CountDownLatch 保证了可见性 1,因此如果 await 没有超时,results[0] 就可以正常进行。不过,代码可能可以重写得更清晰一些。

¹ 即 countDown() 之前线程的所有写入 happen before另一个线程从 await() 调用返回。

<小时/>

一个稍微更清晰(恕我直言)的版本将使用CompletableFuture,如下所示:

CompletableFuture<Object> future = new CompletableFuture();

EventObjectListener eventListener = (topic, eventObject) ->
future.complete(eventObject);

try {
return future.get(waitMagnitude, waitUnit);
} catch(Exception e) {
return null;
} finally {
eventReceiver.removeEventListener(eventListener);
}

关于java - 这个对象在监听器中修改是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52040579/

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