java - 具有空键功能的线程安全映射

标签 java synchronization hashmap concurrenthashmap

我需要一个多线程 Map 对象用于我的网络服务器缓存,并且我需要有 null 键。

HashMap 允许我使用空键,但 ConcurrentHashMap 不允许。我尝试使用 Collections.synchronizedMap(new HashMap()) 创建 HashMap 的同步版本,但它也不接受 null 键。

有没有我可以使用的替代方案,而不必实现某种方式来包装 null 键?

最佳答案

Collections.synchronizedMap 返回的 Map支持您提供的 Map 的所有功能。如果你给它一个 HashMap,它支持 null 键(还有 null 值,你说 “......我需要具有“空”键值...”,可以用任何一种方式读取)。是什么让您认为它不是?

这按预期工作,例如:

import java.util.*;

public class MapTest
{
    public static final void main(String[] args)
    {
        Map map;

        try
        {
            map = Collections.synchronizedMap(new HashMap());
            map.put("one", "a");
            System.out.println("Size = " + map.size());
            map.put(null, "b");
            System.out.println("Size = " + map.size());
            System.out.println("map.get(null) = " + map.get(null));
        }
        catch (Exception ex)
        {
            System.out.println("Exception: " + ex.getMessage());
            ex.printStackTrace(System.out);
        }
        System.exit(0);
    }
}

输出:

Size = 1
Size = 2
map.get(null) = b

关于java - 具有空键功能的线程安全映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5699794/

相关文章:

Java:如何动态同步方法

java - 检查列表是否是 HashMap 中的值

ruby - 循环遍历 XML 以在 Ruby 中创建哈希数组

java - 如何计算具有相同键的 HashMap 值的平均值

java - 基于区域设置的 Joda-Time DateTime 格式

java - 将属性更改事件从孙(曾孙)子传播到父的正确方法

java - 如何以及为什么不在 URLConnection (DownloadFile) 上运行 "timeout"?

java - java中的内部锁和监视器锁有什么区别?

java - 如何使用 Sprite 作为另一个 Sprite 的 anchor ?

synchronization - 名为 mutex 的 boost 进程间在崩溃后仍保持获取状态