Java 更新对不可变对象线程安全的引用
假设多个线程使用同一个配置对象,有时从中读取一个真正不可变的对象。此外,对不可变对象的引用可以得到更新Java 更新对不可变对象线程安全的引用,java,multithreading,thread-safety,immutability,Java,Multithreading,Thread Safety,Immutability,假设多个线程使用同一个配置对象,有时从中读取一个真正不可变的对象。此外,对不可变对象的引用可以得到更新 public class Configuration { private ImmutableObject immutableObject; private ReentrantReadWriteLock lock; private void update() { lock.writeLock().lock(); immutableObje
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的访问线程安全的好方法吗?我想我甚至不需要锁,因为引用的更新是原子的,但我不确定
我想我甚至不需要锁,因为引用的更新是原子的
“原子”意味着任何线程都不会看到未由其他线程存储的immutableObject
的值,但它不会说明何时存储
如果没有同步,就无法保证线程A调用update()
后线程B何时(如果有)会看到新值。认真地说,Java语言规范并不要求线程A存储的值对线程B可见,除非在两个线程之间建立了“之前发生”的链
锁定和解锁Lock
对象建立了这种关系:线程a在解锁锁之前存储到任何共享变量中的任何内容,都保证在线程B锁定同一个锁之后,线程B会看到
有许多其他方法可以达到同样的效果。您可以使用synchronized
,也可以使用一些java.utils.concurrent
对象,例如隐式同步某些内容的队列或信号量
或者,您可以将
immutableObject
声明为volatile
。当线程B随后读取相同的易失性变量时,线程A存储到易失性变量中的任何内容都保证对线程B可见。谢谢!我也不确定可见性,但我忘了在我的问题中添加这一点。