4

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

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

请让我知道您的想法和建议。

先感谢您。

4

3 回答 3

6

您应该使用ConcurrentSkipListMap。它是线程安全的、快速的并且根据对象的可比较实现来维护排序。

于 2012-03-29T02:29:39.963 回答
1

如果您没有对其进行大量更改并且只想对其进行排序,则应使用由 ** Collections.synchronizedMap()调用包装的TreeMap **

您的代码将是这样的:

public class YourClass {
  public static final Map<Something,Something> MAP = Collections.synchronizedMap( new TreeMap<Something,Something>() );
}
于 2012-03-29T02:22:11.710 回答
1

我的“ConcurrentHashMap”是一个静态变量,因此我可以保证只有一个实例。但是当我要对其进行排序时,我将其转换为列表,然后排序然后将其放回新的 concurrentHashMap。

这不是一个简单的问题。

我可以告诉你一个事实,使用 ConcurrentHashMap 不会使这个线程安全。也不会使用synchronizedMap包装器。问题是排序不支持作为单个原子操作。相反,它涉及一系列 Map API 操作,它们之间可能存在很大的时间间隔。

我可以想到两种方法来解决这个问题:

  • 通过使用保持键顺序的 Map 来避免首先进行排序;例如使用 ConcurrentSkipListMap。

  • 使用同步方法将 Map 类包装在自定义同步包装器类中sort。这种方法的问题在于,您可能会重新引入通过使用 ConcurrentHashMap 避免的并发瓶颈。


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

于 2012-03-29T02:30:44.310 回答