只读取它时是否必须使用线程安全的Map实现?

Mik*_*e Q 7 java concurrency multithreading

如果我做以下事情.

  • 创建一个HashMap(在最后一个字段中)
  • 填充HashMap
  • 用不可修改的包装器Map包装HashMap
  • 启动将访问但不修改Map的其他线程

据我所知,Map已经"安全发布",因为其他线程是在Map完全填充后启动的,所以我认为从多个线程访问Map是可以的,因为在此之后它无法修改.

这是正确的吗?

Bal*_*usC 11

关于地图本身,这完全没问题.但是你需要意识到使地图不可修改只会使地图本身不可修改而不是它的键和值.所以,如果你有例如Map<String, SomeMutableObject>诸如Map<String, List<String>>,那么线程将仍然可以通过例如改变的价值map.get("foo").add("bar");.为避免这种情况,您还希望将键/值设置为不可变/不可修改.