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

Final object references - is visibility guaranteed between all threads?

我正在阅读这篇文章:

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

它说:

The fields on any object accessed via a final reference are also guaranteed to be at least as up to date as when the constructor exits. This means that: Values of final fields, including objects inside collections referred to by a final reference, can be safely read without synchronization.

假设我有一个 class 如下:

public class Cache {


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

如果我在主申请中声明 class:

private final Cache cache;

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

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

获得的保证
private final Cache cache;

缓存已安全发布。这意味着 readers/other 线程会将缓存观察为正确构造的对象(在您的情况下,currencyMap 和 currencyList 不会为 null 并且将被正确构造)。

如果 ThreadA 修改了 currencyList ,则不能保证 ThreadB 会看到新值。您必须同步访问 currencyList 才能实现此目的。

currencyMap是线程安全的ConncurrentHashMapclass(改变地图状态的方法是内部同步的)。如果您永远不会更改对 currencyMap 的引用(您永远不会为该引用分配其他地图),那么您不必同步对该地图的访问(因为缓存已安全发布),但最好是声明currencyMap 为 final(这将确保引用不会被重新分配)。