当前位置: 首页 > 知识库问答 >
问题:

关于java中的双键并发hashmap

单于山
2023-03-14

我需要双键并发hashmap。

我的第一次尝试只是使用java.util.concurrent.ConTrentHashMap。像这样

ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("key1" + "|" +"key2", "value");
String vaule = map.get("key1" + "|" +"key2");

但我觉得这很难看。

我的第二次尝试是使用对象作为键。像这样

@Data
public class DualKey {
    private final String key1;
    private final String key2;
}
map.put(new DualKey("key1", "key2"), "value");
String vaule = map.get(new DualKey("key1", "key2"));

最后一次尝试是创建DualkeyConcurrentHashMap。我只需要放,拿,康纳斯基。

public class DualkeyConcurrentHashMap<K1, K2, V>  {
    private final ConcurrentHashMap<K1, ConcurrentHashMap<K2, V>> map 
                                                    = new ConcurrentHashMap<>();

    public V put(K1 key1, K2 key2, V value) {
        ConcurrentHashMap<K2, V> subMap 
                    = map.computeIfAbsent(key1, k -> new ConcurrentHashMap<>());
        return subMap.put(key2, value);
    }

    public V get(K1 key1, K2 key2) {
        ConcurrentHashMap<K2, V> subMap = map.get(key1);
        return null == subMap ? null : subMap.get(key2);
    }

    public boolean containsKey(K1 key1, K2 key2) {
        return null != get(key1, key2);
    }
}

它更好,而且完全线程安全吗?(我不能确定所有方法都需要同步。)

还有其他推荐的方法吗?

共有1个答案

南门鸿振
2023-03-14

所有选项都是线程安全的,这由ConcurrentHashMap保证。需要注意的重要事实是:

然而,即使所有操作都是线程安全的,检索操作也不需要锁定,并且不支持以阻止所有访问的方式锁定整个表。在依赖其线程安全但不依赖其同步详细信息的程序中,此类可以与哈希表完全互操作。

实现双键映射的自然方法是提供一个对象,因此我将使用第二个对象,只是我将使DualKey通用。

第一种方法结合了实现和设计(string1“|”string1key格式),不允许轻松更改用作键的类型。

第三种方法使用的ConcurrentHashMap实例比需要的多得多。

 类似资料:
  • 问题内容: 该符号在Java中是什么意思?我以前从未见过它使用过,但今天却遇到了它。我曾尝试在Google上进行搜索,但没有发现任何有用的信息。 问题答案: 这是位移位运算符。 文献资料 有符号的左移位运算符“ <<”将位模式向左移位,而有符号的右移位运算符“ ”将位模式向右移位。位模式由左操作数给出,移位位置的数量由右操作数给出。无符号右移运算符“ >>>”将零移位到最左位置,而“ ”之后的最左

  • 问题内容: 众所周知,C#提供了一个AS关键字,该关键字会自动执行一次检查,检查对象是否属于某种类型,如果是,则将其强制转换为所需的类型,否则给出null。 在上面的示例中,这里的Object obj可以是User类型或其他类型。用户将获得User类型的对象或null。这是因为C#的As关键字首先执行检查,然后在可能的情况下将对象强制转换为结果类型。 那么Java中有没有与C#的AS关键字等效的关

  • 本文向大家介绍Java并发编程:volatile关键字详细解析,包括了Java并发编程:volatile关键字详细解析的使用技巧和注意事项,需要的朋友参考一下 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从

  • 问题内容: 您能否告诉我在单线程环境中是否有可能发生并发修改异常的方法,我下面发布的以下应用程序由两个线程组成,请告诉我我也可以在单个线程中看到相同的异常..请劝告 是的,我知道,在单线程环境中,此错误可能会出现..如下面的代码所示。 请告知解决该问题的方法是什么..这样就不会出现此错误.. !! 问题答案: 可以在单线程环境中引发A。只要在不应该​​在上下文中修改对象的情况下使用它,就不必在另一

  • 问题内容: 为什么没有用于同步/并发的关键字? 到目前为止,我的研究为我提供了一种解决方案,您包装了一些高级类并使用它们来处理并发。 给定一个纯Kotlin项目,如果需要一个小型的高度优化的组件来处理并发等,该怎么办? 我的印象是Kotlin是Java的辅助语言,可以用Kotlin编写90%的代码,但有一些Java语言无法用Kotlin表示。 这是正确的吗?这是原来的样子吗? 问题答案: Kotl

  • 为什么没有同步和并发的关键字? 到目前为止,我的研究给了我一个解决方案,你包装一些高级类,并用它们来处理并发。 给定一个纯Kotlin的项目,如果需要一个以线程安全方式处理并发的小型、高度优化的组件,应该怎么做? 我的印象是,Kotlin是Java的一种辅助语言,可以用Kotlin编写90%的代码,但有一些Java代码无法用Kotling表达。 这是对的吗?这就是它的目的吗?