2

我需要双键并发哈希图。

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

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。我只需要 put, get, containsKey。

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

它是更好和完美的线程安全吗?(我不能决定所有方法都需要同步。)

还有其他推荐的方法吗?

4

1 回答 1

3

所有选项都是线程安全的,由ConcurrentHashMap. 需要注意的重要事实是

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

实现双键映射的自然方法是提供一个对象,所以我会选择第二个,只是我会DualKey通用。

第一个结合了实现和设计(string1 "|" + string1键格式),不允许您轻松更改用作键的类型。

第三个使用了ConcurrentHashMap比需要更多的实例。

于 2017-06-02T06:40:48.297 回答