gpt4 book ai didi

java - 使用 ConcurrentMap 双重检查锁定

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:31 24 4
gpt4 key购买 nike

我有一段代码可以由多个线程执行,这些线程需要执行 I/O 绑定(bind)操作以初始化存储在 ConcurrentMap 中的共享资源。我需要使此代码线程安全并避免不必要的调用来初始化共享资源。这是错误代码:

    private ConcurrentMap<String, Resource> map;

// .....

String key = "somekey";
Resource resource;
if (map.containsKey(key)) {
resource = map.get(key);
} else {
resource = getResource(key); // I/O-bound, expensive operation
map.put(key, resource);
}

使用上面的代码,多个线程可能会检查 ConcurrentMap 并发现资源不存在,并且所有线程都尝试调用开销很大的 getResource()。为了确保仅对共享资源进行一次初始化并在资源初始化后使代码高效,我想做这样的事情:

    String key = "somekey";
Resource resource;
if (!map.containsKey(key)) {
synchronized (map) {
if (!map.containsKey(key)) {
resource = getResource(key);
map.put(key, resource);
}
}
}

这是双重检查锁定的安全版本吗?在我看来,由于检查是在 ConcurrentMap 上调用的,它的行为就像一个声明为 volatile 的共享资源,因此可以防止任何“部分初始化”问题这可能会发生。

最佳答案

如果你可以使用外部库,看看 Guava 的 MapMaker.makeComputingMap() .它是为您想要做的事情量身定制的。

关于java - 使用 ConcurrentMap 双重检查锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7003239/

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