我在“多线程”应用程序中使用“concurrentHashMap”。我能够按照这里的描述对其进行排序。但由于我正在将 hashmap 转换为列表,所以我有点担心 thred 的安全性。我的“ConcurrentHashMap”是一个静态变量,因此我可以保证只有一个实例。但是当我要对其进行排序时,我将其转换为列表,然后排序然后将其放回新的 concurrentHashMap。
这是多线程激活的好习惯吗?
请让我知道您的想法和建议。
先感谢您。
我在“多线程”应用程序中使用“concurrentHashMap”。我能够按照这里的描述对其进行排序。但由于我正在将 hashmap 转换为列表,所以我有点担心 thred 的安全性。我的“ConcurrentHashMap”是一个静态变量,因此我可以保证只有一个实例。但是当我要对其进行排序时,我将其转换为列表,然后排序然后将其放回新的 concurrentHashMap。
这是多线程激活的好习惯吗?
请让我知道您的想法和建议。
先感谢您。
您应该使用ConcurrentSkipListMap。它是线程安全的、快速的并且根据对象的可比较实现来维护排序。
如果您没有对其进行大量更改并且只想对其进行排序,则应使用由 ** Collections.synchronizedMap()调用包装的TreeMap **
您的代码将是这样的:
public class YourClass {
public static final Map<Something,Something> MAP = Collections.synchronizedMap( new TreeMap<Something,Something>() );
}
我的“ConcurrentHashMap”是一个静态变量,因此我可以保证只有一个实例。但是当我要对其进行排序时,我将其转换为列表,然后排序然后将其放回新的 concurrentHashMap。
这不是一个简单的问题。
我可以告诉你一个事实,使用 ConcurrentHashMap 不会使这个线程安全。也不会使用synchronizedMap
包装器。问题是排序不支持作为单个原子操作。相反,它涉及一系列 Map API 操作,它们之间可能存在很大的时间间隔。
我可以想到两种方法来解决这个问题:
通过使用保持键顺序的 Map 来避免首先进行排序;例如使用 ConcurrentSkipListMap。
使用同步方法将 Map 类包装在自定义同步包装器类中sort
。这种方法的问题在于,您可能会重新引入通过使用 ConcurrentHashMap 避免的并发瓶颈。
值得指出的是,对 aHashMap
或 a进行排序没有任何意义,ConcurrentHashMap
因为这些映射不会保留您对元素进行排序的顺序。您可以使用 a LinkedHashMap
,它保留条目插入顺序。