我需要双键并发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);
}
}
它更好,而且完全线程安全吗?(我不能确定所有方法都需要同步。)
还有其他推荐的方法吗?
所有选项都是线程安全的,这由ConcurrentHashMap
保证。需要注意的重要事实是:
然而,即使所有操作都是线程安全的,检索操作也不需要锁定,并且不支持以阻止所有访问的方式锁定整个表。在依赖其线程安全但不依赖其同步详细信息的程序中,此类可以与哈希表完全互操作。
实现双键映射的自然方法是提供一个对象,因此我将使用第二个对象,只是我将使DualKey
通用。
第一种方法结合了实现和设计(string1“|”string1
key格式),不允许轻松更改用作键的类型。
第三种方法使用的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表达。 这是对的吗?这就是它的目的吗?