簡體   English   中英

更新對不可變對象線程安全的引用

[英]Update reference to immutable object thread-safe

假設多個線程使用同一個Configuration對象,有時會從中讀取一個真正不可變的對象。 此外,對不可變對象的引用可能會更新。

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的值,該值不是由其他線程存儲的,但沒有說什么時候

如果不同步,沒有什么時候(如果有的話),線程B會看到新的值之后線程A調用保證update() 認真地講,Java語言規范不要求線程A所存儲的值永遠對線程B可見,除非在兩個線程之間建立了一些“之前發生”的鏈。

鎖定和解鎖Lock對象將建立這種關系:線程A鎖定相同的鎖之后,線程A保證線程A在解鎖之前將其存儲到任何共享變量中的任何內容都可以由線程B看到。

還有多種其他方法可以達到相同的效果。 您可以使用synchronized ,也可以使用一些java.utils.concurrent對象,例如隱式同步某些內容的隊列或信號燈。

或者,您可以將immutableObject聲明為volatile 當線程B隨后讀取相同的volatile變量時,保證線程A存儲到volatile變量中的任何內容對於線程B都是可見的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM