Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新对不可变对象线程安全的引用_Java_Multithreading_Thread Safety_Immutability - Fatal编程技术网

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可见。

谢谢!我也不确定可见性,但我忘了在我的问题中添加这一点。