- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设多个线程使用同一个 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/
我是一名优秀的程序员,十分优秀!