Java线程安全的地图

我需要一个线程安全的地图,我有这样的事情:(我是非常新的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 } } 

java.util.concurrent.ConcurrentHashMap

java.util.concurrent包中的ConcurrentHashMap类是Map的线程安全实现,它提供了比synchronizedMap更好的并发synchronizedMap (以及比Hashtable更高的可伸缩性)。 见http://www.ibm.com/developerworks/java/library/j-jtp07233.html

使用ConcurrentHashMap

你的代码应该看起来像这样,忽略导入,等等。

 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 。

如果你想在静态块中访问它,你的地图“列表”需要是静态的。

您无法在静态块中初始化对象成员variables。 静态块在第一次加载类时执行一次,对于该类的每个对象不会执行一次,而对于类的每个对象都会创build一次variables“list”。

此外,你不能实例化一个“新地图”,因为地图是一个接口。 你需要把这个synchronizedMap封装在一个像HashMap或者TreeMap的真正的Map上。

  { list = new java.util.Collections .synchronizedMap(new HashMap<String, Client>()); } 

来自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)