[英]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.