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)