我需要一个线程安全地图,我有这样的东西:(我对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
}
}
ConcurrentHashMap
类来自java.util.concurrent
软件包的类是映射的线程安全实现,它提供的并发性要比synchronizedMap
(且可扩展性远远超过Hashtable
)。请参阅Http://www.ibm.com/developererworks/java/library/j-jtp07233.html.
和atmicity保证。第二个将这些保证添加到将其密钥保持在一定顺序的实施中。 类 可模拟地图
java提供了两个实现这些接口的类。第三方库还可以提供实施这些接口的类。与Java捆绑在一起的课程是:
ConcurrentNavigableMap
(用于NavigableMap
ConcurrentHashMap
(用于ConcurrentMap
和ConcurrentSkipListMap
示例用法:
ConcurrentMap
…和:ConcurrentNavigableMap
如果
unmodififiable地图适合您,请参见
ConcurrentMap < Project , Person > map = new ConcurrentHashMap<>() ;
ConcurrentNavigableMap < Month , Person > map = new ConcurrentSkipListMap <>() ;
和方法。不可修复会带来线程安全读取的访问。胶质地图
有一个旧类,
Map.ofEntries
通常不再使用了。但是,为了完整,我们应该为提供线程安全的同步方法提及此类。引用Javadoc:
Map.copyOf
。如果需要进行高度电流的实现,则建议使用
HashMap
来代替Hashtable
.。
表
我制作的是一个图形表,显示了与Java捆绑的各种实现的各种特征。ConcurrentHashMap
在currency列中的红色框的外观。
Hashtable
java并发收藏。
如果要在静态块中访问,则您的地图“列表”需要静态。您无法在静态块中初始化对象成员变量。 首先加载类时,执行静态块一次,而不是该类的每个对象一次,而对于类的每个对象,则创建了一次变量“列表”。 ,您也无法实例化“新地图”,因为地图是接口。 您需要将同步图包裹在诸如hashmap或treemap之类的真实地图上。
Map
从java.util.collections
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
}
}