gpt4 book ai didi

java - 更新对不可变对象(immutable对象)线程安全的引用

转载 作者:行者123 更新时间:2023-11-30 02:38:28 24 4
gpt4 key购买 nike

假设多个线程使用同一个 Configuration 对象,有时从中读取一个真正不可变的对象。此外,对不可变对象(immutable对象)的引用可以更新。

public class Configuration {
private ImmutableObject immutableObject;
private ReentrantReadWriteLock lock;

private void update() {
lock.writeLock().lock();
immutableObject = getNewImmutableObject();
lock.writeLock().unlock();
}

public ImmutableObject getImmutableObject() {
ImmutableObject newRef;
lock.readLock().lock();
newRef = immutableObject;
lock.readLock().unlock();
return newRef;
}
}

这是使 immutableObject 的访问线程安全的好方法吗?我想我什至不需要锁,因为引用的更新是原子的,但我不确定。

最佳答案

I think I don't even need the lock, because the update of the reference is atomic

“原子”意味着任何线程都不会看到未由其他线程存储的 immutableObject 值,但它没有说明何时

如果没有同步,就无法保证线程 B 何时(如果曾经)在线程 A 调用 update() 后看到新值。说真的,Java 语言规范并不要求线程 A 存储的值永远对线程 B 可见,除非在两个线程之间建立了某种“之前发生”的链。

锁定和解锁 Lock 对象建立了这种关系:线程 A 在解锁锁之前存储到任何共享变量中的任何内容都保证能被线程 B 在之后看到线程 B 锁定同一个锁。

还有多种其他方法可以达到相同的效果。您可以使用synchronized,也可以使用一些java.utils.concurrent对象,例如隐式同步某些内容的队列或信号量。

或者,您可以将 immutableObject 声明为 volatile 。当线程 B 随后读取同一个 volatile 变量时,线程 A 存储到 volatile 变量中的任何内容都保证对线程 B 可见。

关于java - 更新对不可变对象(immutable对象)线程安全的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42445588/

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