最终对象引用 - 是否保证所有线程之间的可见性?
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(这将确保引用不会被重新分配)。
我正在阅读这篇文章:
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(这将确保引用不会被重新分配)。