最终对象引用-是否保证所有线程之间的可见性?

时间:2019-02-06 19:02:27

标签: java multithreading final

我正在阅读这篇文章:

https://www.javamex.com/tutorials/synchronization_final.shtml

它说:

  

通过最终引用访问的任何对象上的字段也保证至少与构造函数退出时的字段保持最新。这意味着:   最终字段(包括最终引用所引用的集合内的对象)的值可以安全地读取而无需同步。

说我有一个如下的课程:

public class Cache {


private Map<String, Currency> currencyMap = new ConcurrentHashMap<String, Currency>();
private List<Currency> currencyList = new ArrayList<Currency>();
}

如果我在主应用程序类中声明:

private final Cache cache;

这是否意味着如果线程A更新currencyMap和currencyList,那么这将保证线程B将看到currencyMap和currencyList中的最新条目?

1 个答案:

答案 0 :(得分:0)

不能保证ThreadB会看到ThreadA对currencyList所做的更新。

为您提供的保证
private final Cache cache;

是缓存已安全发布。这意味着读取器/其他线程会将缓存视为正确构造的对象(在您的情况下,currencyMap和currencyList不会为null,而是会正确构造)。

如果ThreadA修改了currencyList,则不能保证ThreadB将看到新值。为此,您必须同步对currencyList的访问。

currencyMap是ConncurrentHashMap,它是线程安全的类(更改映射状态的方法在内部是同步的)。如果您从不更改对currencyMap的引用(您将永远不会为该引用分配任何其他地图),则不必同步对该地图的访问(因为缓存已安全发布),但最好声明一下CurrencyMap为最终版本(这将确保不会重新分配引用)。