java

问题描述 投票:0回答:5

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

        }
java
5个回答

37
投票

ConcurrentHashMap
类来自
java.util.concurrent
软件包的类是映射的线程安全实现,它提供的并发性要比
synchronizedMap
(且可扩展性远远超过
Hashtable
)。请参阅Http://www.ibm.com/developererworks/java/library/j-jtp07233.html.


8
投票

3
投票

Interfaces

java捆绑了一对concurrent的一对接口:


  • Map
    
    
  • ConcurrentMap
    
    
  • 第一个制作
thread-safety

atmicity保证。第二个将这些保证添加到将其密钥保持在一定顺序的实施中。 可模拟地图

java提供了两个实现这些接口的类。第三方库还可以提供实施这些接口的类。与Java捆绑在一起的课程是:

ConcurrentNavigableMap

(用于

NavigableMap

unmodifibleMaps

如果
unmodififiable
地图适合您,请参见

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

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

Map.of

方法。不可修复会带来线程安全读取的访问。
胶质地图
有一个旧类,
Map.ofEntries
通常不再使用了。但是,为了完整,我们应该为提供线程安全的
同步方法提及此类。引用Javadoc:

如果不需要线程安全实现,建议使用

Map.copyOf

代替Hashtable

。如果需要进行高度电流的实现,则建议使用
HashMap来代替Hashtable.

ConcurrentHashMap
我制作的是一个图形表,显示了与Java捆绑的各种实现的各种特征。
currency列中的红色框的外观。

您的代码应该像这样,忽略Imports等。
Hashtable

说,请注意,这不像您希望的那样安全。正如其他人提到的那样,您可能想使用

java并发收藏。


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

您无法在静态块中初始化对象成员变量。 首先加载类时,执行静态块一次,而不是该类的每个对象一次,而对于类的每个对象,则创建了一次变量“列表”。 ,您也无法实例化“新地图”,因为地图是接口。 您需要将同步图包裹在诸如hashmap或treemap之类的真实地图上。

Map

Table of map implementations in Java 11, comparing their features 从java.util.concurrent


2
投票

从java.util.collections

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.