我在读这篇文章:
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和currentyList中的最新条目?
不能保证ThreadB会看到ThreadA对currencyList所做的更新。使用实现的保证
private final Cache cache;
缓存是安全发布的。这意味着读卡器/其他线程将把缓存视为一个正确构造的对象(在您的情况下,currencyMap和currencyList将不会为null,并且将被正确构造)。
如果ThreadA修改currencyList,则不能保证ThreadB会看到新值。为了实现这一点,您必须同步访问currencyList。
currencyMap是ConncurrentHashMap,它是线程安全类(更改映射状态的方法是内部同步的)。如果你从未更改对currencyMap的引用(你永远不会为该引用分配其他映射),那么你就不必同步对该映射的访问(因为缓存是安全发布的),但最好是将currencyMap声明为final(这将确保引用不会被重新分配)。