java的线程安全映射

时间:2009-11-24 18:33:51

标签: java

我需要一个线程安全的地图,我有这样的东西:(我对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
        }

        }

8 个答案:

答案 0 :(得分:91)

答案 1 :(得分:32)

java.util.concurrent包中的ConcurrentHashMap类是Map的线程安全实现,它提供了比synchronizedMap更好的并发性(并且比Hashtable具有更高的可伸缩性)。请参阅http://www.ibm.com/developerworks/java/library/j-jtp07233.html

答案 2 :(得分:8)

答案 3 :(得分:2)

您的代码应如下所示,忽略导入,等等。

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
    }
}

尽管如此,请注意这并不像您希望的那样安全。正如其他人所提到的,您可能想要使用Java Concurrent Collections

答案 4 :(得分:1)

如果要在静态块中访问它,您的地图“列表”必须是静态的。

答案 5 :(得分:1)

您无法在静态块中初始化对象成员变量。静态块在首次加载类时执行一次,而不是对该类的每个对象执行一次,而变量“list”为类的每个对象创建一次。

此外,您无法实例化“新地图”,因为Map是一个界面。您需要将synchronizedMap包装在真实的Map周围,如HashMap或TreeMap。

        {
           list = new java.util.Collections
          .synchronizedMap(new HashMap<String, Client>());
        }

答案 6 :(得分:1)

接口

Java 为并发 Map 捆绑了一对接口:

第一个保证 thread-safetyatomicity。第二个将这些保证添加到 NavigableMap 实现中,使它们的密钥按特定顺序排列。

课程

可修改的地图

Java 提供了两个实现这些接口的类。第三方库也可能提供实现这些接口的类。与 Java 捆绑的类是:

示例用法:

ConcurrentMap < Project , Person > map = new ConcurrentHashMap<>() ;

……和:

ConcurrentNavigableMap < Month , Person > map = new ConcurrentSkipListMap <>() ;

不可修改的地图

如果 unmodifiable 地图适合您,请参阅 Map.ofMap.ofEntriesMap.copyOf 方法。不可修改带来了线程安全的只读访问。

旧地图

有一个遗留类 Hashtable,通常不再使用。但是,为了完整起见,我们应该提到这个类,因为它提供了线程安全的 synchronized 方法。引用 JavaDoc:

<块引用>

如果不需要线程安全的实现,建议使用 HashMap 代替 Hashtable。如果需要线程安全的高并发实现,则建议使用 ConcurrentHashMap 代替 Hashtable

Map 类表

这是我制作的图表,显示了与 Java 11 捆绑的各种 Map 实现的各种特征。

并发列中查找红色框。

Table of map implementations in Java 11, comparing their features

答案 7 :(得分:0)

来自java.util.concurrent

ConcurrentHashMap<K,V>
ConcurrentMap<K,V>
ConcurrentNavigableMap<K,V>
ConcurrentHashMap<K,V>
ConcurrentSkipListMap<K,V>

来自java.util.Collections

Collections.synchronizedMap(Map<K,V> m)
Collections.synchronizedNavigableMap(NavigableMap<K,V> m)
Collections.synchronizedSortedMap(SortedMap<K,V> m)