据我所知,java.util.Hashtable同步java.util.Map接口中的每个方法,同时Collections.synchronizedMap(hash_map)返回一个包装器对象,其中包含将调用委托给实际的同步方法hash_map(如果我错了,请纠正我).
我有两个问题:
它与同步每个方法和包装类有什么区别?有哪些方案可以选择其中一种?
我们这样做会发生什么Collections.synchronizedMap(hash_table)?这是否等于简单地使用正常java.util.Hashtable?
在多线程应用程序中,是否存在需要时使用带有同步功能的 HashMap 比使用 ConcurrentHashMap 更好的场景?
具体来说,我正在考虑一个地图初始化如下的应用程序:
Map<String,String> map = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
每个线程访问映射只是为了更新它并立即将其转换为字符串,因此唯一的同步块是:
synchronized(map) {
map.put(key,value);
StringBuilder sb = new StringBuilder();
for (String k: map.keySet())
sb.append("("+k+","+map.get(k)+")");
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,将初始化更改为:会更安全吗?
Map<String,String> map = new ConcurrentHashMap<>();
Run Code Online (Sandbox Code Playgroud)
并删除“同步”?