【问题标题】:thread safe map for javajava的线程安全映射
【发布时间】:2021-07-01 18:57:31
【问题描述】:

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

        }

【问题讨论】:

  • 注意,可变静态是一个非常非常非常糟糕的主意。
  • 一个simple主题介绍...

标签: java


【解决方案1】:

【讨论】:

  • 此外,这种实现比 Collections.synchronizedMap 或锁定的 HashMap 快得多
【解决方案2】:

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

【讨论】:

  • 这是对已接受的 IBM 链接的更好响应
  • 链接已损坏。
【解决方案3】:

【讨论】:

    【解决方案4】:

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

    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

    【讨论】:

      【解决方案5】:

      接口

      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 实现的各种特征。

      并发列中查找红色框。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          此外,您不能实例化“新地图”,因为地图是一个接口。您需要将 synchronizedMap 包裹在真实的 Map 周围,例如 HashMap 或 TreeMap。

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

          【讨论】:

          • 对不起,这是一个静态类,我会更新问题
          【解决方案8】:

          来自 java.util.concurrent

          ConcurrentHashMap<K,V>
          ConcurrentMap<K,V>
          ConcurrentNavigableMap<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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-08
            • 2011-03-14
            • 2020-08-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-27
            相关资源
            最近更新 更多