我使用的是&concurrentHashMap'在我的多线程'应用。我能够按照描述here对其进行排序。但由于我将hashmap转换为列表,我有点担心thred安全。我的ConcurrentHashMap'是一个静态变量,因此我可以保证只有一个实例。但是当我要对它进行排序时,我将其转换为列表,然后排序然后将其放回到新的concurrentHashMap中。
这是多线程活跃的好习惯吗?
请告诉我您的想法和建议。
提前谢谢。
答案 0 :(得分:6)
您应该使用ConcurrentSkipListMap。它是线程安全的,快速的,并根据对象的可比实现保持排序。
答案 1 :(得分:1)
如果你没有经常更改它而你只想对它进行排序,你应该使用由<TreeMap 包裹的 Collections.synchronizedMap() **致电
您的代码将是这样的:
public class YourClass {
public static final Map<Something,Something> MAP = Collections.synchronizedMap( new TreeMap<Something,Something>() );
}
答案 2 :(得分:1)
我的'ConcurrentHashMap'是一个静态变量,因此我可以保证只有一个实例。但是当我要对它进行排序时,我将它转换为一个列表,然后排序然后将它放回一个新的concurrentHashMap。
这不是一个简单的问题。
我可以告诉你一个事实,使用ConcurrentHashMap不会使这个线程安全。也不会使用synchronizedMap
包装器。问题是不支持排序作为单个原子操作。相反,它涉及一系列Map API操作,可能在它们之间存在显着的时间间隔。
我可以想到两种方法来解决这个问题:
首先使用保持按键顺序的Map,避免首先进行排序;例如使用ConcurrentSkipListMap。
使用同步sort
方法将Map类包装在自定义同步包装类中。这种方法的问题在于,您可能会使用ConcurrentHashMap重新引入您避免的并发瓶颈。
值得指出的是,对HashMap
或ConcurrentHashMap
进行排序没有任何意义,因为这些地图不会保留您对元素进行排序的顺序。您可以使用LinkedHashMap
,它会保留条目的插入顺序。