gpt4 book ai didi

java - java中的并发双向映射

转载 作者:行者123 更新时间:2023-11-30 04:44:12 25 4
gpt4 key购买 nike

我正在编写文本处理代码,如果我首先将字符串转换为整数,事情就会快很多。为此,我创建了一个 Dictionary 类,每当我看到一个新字符串时,我都会给它一个索引,并保留两个映射,一个从字符串到 int,一个从 int 到字符串,这样我就可以轻松地以两种方式查找。代码如下:

class Dictionary {
private Map<String, Integer> map;
private Map<Integer, String> reverse_map;
private int nextIndex;

public Dictionary() {
map = new HashMap<String, Integer>();
reverse_map = new HashMap<Integer, String>();
nextIndex = 1;
}

public int getIndex(String string) {
if (!map.containsKey(string)) {
map.put(string, nextIndex);
reverse_map.put(nextIndex, string);
nextIndex++;
}
return map.get(string);
}

public String getString(int index) {
// getIndex is always called first, so we don't need to check anything
return reverse_map.get(index);
}
}

这在我的单线程代码中运行良好。但现在我想给它多个线程来加快速度,但我不知道该怎么做。我想过使用 ConcurrentHashMap,但我不确定 putIfAbsent 是否能保证我不会两次使用索引。我不想使用 Collections.synchronizedMap,因为这个字典在线程中被频繁访问,所以我可能不会比使用单个线程好多少,因为它会在每次读写时阻塞。有办法让它工作吗?

最佳答案

并发解决方案的问题是原子性。这是我的想法:

private final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
private final ConcurrentMap<Integer, String> reverse_map = new ConcurrentHashMap<Integer, String>();
private final AtomicInteger nextIndex = new AtomicInteger(1);

public int getIndex(String string) {
Integer i = map.get(string);
if (i == null) {
final Integer newI = nextIndex.getAndIncrement();
i = map.putIfAbsent(string, newI);
if (i == null) {
reverse_map.put(newI, string);
return newI;
}
}
return i;
}

这有一个非常良性的故障模式:一些索引将被闲置。

请注意,我无条件地放入了第二张 map ,因为此时我知道我负责手头的字符串。

关于java - java中的并发双向映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11476894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com