Oun*_*ney 3 java concurrency multithreading volatile
我之前写过一段代码,它从jar文件中动态加载类.因此,基本上可以在123-de目录中存在a.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();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码已经过测试,运行正常.但今天我正在重新审视这段代码,并观察到我并不真正需要concurrenthashmap,因为我使用显式锁定来写入它.我只需要内存可见性,因为我在锁外读它.所以,我真的在想这样volatile hashmap
做了吗?我应该还原它(不要因为它已经测试过了)或者如果我保留它可以吗?
您是否正在访问classLoaderMap
其他地方以从中读取值?如果是,您还需要在那里使用相同的锁以确保内存可见性.
volatile
在这种情况下不会有帮助,因为它只会确保变量值的更新classLoaderMap
对其他线程可见,而不是地图本身的内容.
我仍然建议ConcurrentHashMap
在这种情况下使用,这样就不需要显式锁定并确保内存可见地图内容.
使用Java 8,使用时代码可以简化得更多ConcurrentHashMap
:
classLoaderMap.computeIfAbsent(directoryPath, (path) -> createClassLoader(path));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
496 次 |
最近记录: |