使用线程安全性对concurrentHashMap进行排序

时间:2012-03-29 02:08:31

标签: java multithreading collections concurrenthashmap

我使用的是&concurrentHashMap'在我的多线程'应用。我能够按照描述here对其进行排序。但由于我将hashmap转换为列表,我有点担心thred安全。我的ConcurrentHashMap'是一个静态变量,因此我可以保证只有一个实例。但是当我要对它进行排序时,我将其转换为列表,然后排序然后将其放回到新的concurrentHashMap中。

这是多线程活跃的好习惯吗?

请告诉我您的想法和建议。

提前谢谢。

3 个答案:

答案 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重新引入您避免的并发瓶颈。


值得指出的是,对HashMapConcurrentHashMap进行排序没有任何意义,因为这些地图不会保留您对元素进行排序的顺序。您可以使用LinkedHashMap,它会保留条目的插入顺序。