gpt4 book ai didi

java - 使用 double-check 习语更正

转载 作者:行者123 更新时间:2023-11-30 06:36:55 24 4
gpt4 key购买 nike

public class Generator {
private static final Map<byte[], byte[]> cache = new HashMap<byte[], byte[]>();

public static byte[] generate(byte[] src) {
byte[] generated = cache.get(src);
if (generated == null) {
synchronized (cache) {
generated = cache.get(src);
if (generated == null) {
generated = doGenerate(src);
cache.put(src, generated);
}
}
}
return generated;
}

private static byte[] doGenerate(byte[] src) {...}

任何人都可以回答,这段代码有什么问题吗?也许 generate() 方法可以返回部分构造的数组,不是吗?

最佳答案

用 ConcurrentHashMap 替换你的 HashMap。

您的同步看起来没有用。我会以这种方式重写整个事情:

private static final Map<byte[], byte[]> cache = new ConcurrentHashMap<byte[], byte[]>();

public static byte[] generate(byte[] src, int counter) {
byte[] generated = cache.get(src);
if (generated == null) {
generated = doGenerate(src);
cache.put(src, generated);
}
return generated;
}

编辑: try/catch 很奇怪而且没有必要。出于 OP 的目的,使用 ConcurrentHashMap 就足够了。如果 OP 真的不想承受为同一数据集调用两次 doGenerate 的成本,那么他们将不得不继续使用 DCL 模式,但仍然建议使用 ConcurrentHashMap。

关于java - 使用 double-check 习语更正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4153840/

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