gpt4 book ai didi

java - 在这种情况下,volatile hashmap 是否足够?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:53:39 26 4
gpt4 key购买 nike

我以前写过一段代码,它从 jar 文件中动态加载类。所以,基本上123-de目录下可以有一个.jar,456-fg目录下可以有另一个a.jar。现在根据某些参数,我决定使用哪个 jar 并从 123-de 目录或 456-fg 目录加载一个类,比如 calc.java。

为此,我必须创建类加载器并使用这些类加载器加载 calc.java

当然,每个 jar 应该有一个类加载器,每个类应该在内存中加载一个类。

为此,我使用了一个存储类加载器/类的并发 HashMap 。假设此并发 HashMap 的键是目录名称。

所以,给定一个目录,我检查类加载器是否已经存在——如果不存在,我就创建一个然后存储它。

if(classLoaderMap.get(directoryPath) == null){
rlock.lock();
try{
if(classLoaderMap.get(directoryPath) == null){

ClassLoader classLoader = // Create classLoader here.
classLoaderMap.put(directoryPath, classLoader);
}
}finally{
rlock.unlock();
}
}

这段代码已经过测试并且工作正常。但是今天我重新访问这段代码并观察到我并不真正需要 concurrenthashmap 因为我正在使用显式锁定来写入它。我只需要内存可见性,因为我正在锁外读取它。所以,我真的在想 volatile hashmap 就可以完成这项工作吗?我应该还原它(尽管已经过测试但不想这样做)还是保留它可以吗?

最佳答案

您是否正在其他地方访问 classLoaderMap 以从中读取值?如果是,您还需要在那里使用相同的锁以确保内存可见性。

volatile 在这种情况下无济于事,因为它只会确保对变量 classLoaderMapvalue 的更新对其他线程可见,而不是 map 本身的内容。

在这种情况下,我仍然建议使用 ConcurrentHashMap,这样就不需要显式锁定并确保 map 内容的内存可见性。

在 Java 8 中,使用 ConcurrentHashMap 可以简化代码:

classLoaderMap.computeIfAbsent(directoryPath, (path) -> createClassLoader(path));

关于java - 在这种情况下,volatile hashmap 是否足够?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39062615/

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