我需要一个线程安全的地图,我有这样的东西:(我对java很新)
public static class Manager
{
static
{
//something wrong here, doesn't compile
list = new java.util.Collections
.synchronizedMap(new Map<String, Client>());
}
static Map<String,Client> list;
public static void AddClient(Client client)
{
// thread safe add client to the list
}
public static void RemoveClient(Client client)
{
// thread safe remove client to the list
}
}
答案 0 :(得分:91)
答案 1 :(得分:32)
java.util.concurrent
包中的ConcurrentHashMap
类是Map的线程安全实现,它提供了比synchronizedMap
更好的并发性(并且比Hashtable
具有更高的可伸缩性)。请参阅http://www.ibm.com/developerworks/java/library/j-jtp07233.html。
答案 2 :(得分:8)
答案 3 :(得分:2)
您的代码应如下所示,忽略导入,等等。
public class Manager
{
Map<String,Client> list = java.util.Collections.synchronizedMap(new HashMap<String, Client>());
public void AddClient(Client client)
{
// thread safe add client to the list
}
public void RemoveClient(Client client)
{
// thread safe remove client to the list
}
}
尽管如此,请注意这并不像您希望的那样安全。正如其他人所提到的,您可能想要使用Java Concurrent Collections。
答案 4 :(得分:1)
如果要在静态块中访问它,您的地图“列表”必须是静态的。
答案 5 :(得分:1)
您无法在静态块中初始化对象成员变量。静态块在首次加载类时执行一次,而不是对该类的每个对象执行一次,而变量“list”为类的每个对象创建一次。
此外,您无法实例化“新地图”,因为Map是一个界面。您需要将synchronizedMap包装在真实的Map周围,如HashMap或TreeMap。
{
list = new java.util.Collections
.synchronizedMap(new HashMap<String, Client>());
}
答案 6 :(得分:1)
Java 为并发 Map
捆绑了一对接口:
第一个保证 thread-safety 和 atomicity。第二个将这些保证添加到 NavigableMap
实现中,使它们的密钥按特定顺序排列。
Java 提供了两个实现这些接口的类。第三方库也可能提供实现这些接口的类。与 Java 捆绑的类是:
ConcurrentHashMap
(对于ConcurrentMap
)ConcurrentSkipListMap
(用于 ConcurrentMap
和 ConcurrentNavigableMap
)示例用法:
ConcurrentMap < Project , Person > map = new ConcurrentHashMap<>() ;
……和:
ConcurrentNavigableMap < Month , Person > map = new ConcurrentSkipListMap <>() ;
如果 unmodifiable 地图适合您,请参阅 Map.of
、Map.ofEntries
和 Map.copyOf
方法。不可修改带来了线程安全的只读访问。
有一个遗留类 Hashtable
,通常不再使用。但是,为了完整起见,我们应该提到这个类,因为它提供了线程安全的 synchronized 方法。引用 JavaDoc:
如果不需要线程安全的实现,建议使用 HashMap
代替 Hashtable
。如果需要线程安全的高并发实现,则建议使用 ConcurrentHashMap
代替 Hashtable
。
Map
类表这是我制作的图表,显示了与 Java 11 捆绑的各种 Map
实现的各种特征。
在并发列中查找红色框。
答案 7 :(得分:0)
来自java.util.concurrent
ConcurrentHashMap<K,V>
ConcurrentMap<K,V>
ConcurrentNavigableMap<K,V>
ConcurrentHashMap<K,V>
ConcurrentSkipListMap<K,V>
来自java.util.Collections
Collections.synchronizedMap(Map<K,V> m)
Collections.synchronizedNavigableMap(NavigableMap<K,V> m)
Collections.synchronizedSortedMap(SortedMap<K,V> m)