我正在扩展图书馆为我做一些工作。这是代码:
public static synchronized String decompile(String source, int flags,UintMap properties,Map<String,String> namesMap)
{
Decompiler.namesMap=namesMap;
String decompiled=decompile(source,flags,properties);
Decompiler.namesMap=null;
return decompiled;
}
问题是namesMap
是静态变量。该线程是否安全?因为如果这段代码运行得很简单,那么namesMap变量可能会改变。我能为此做些什么?
答案 0 :(得分:5)
方法 decompile
是线程安全的(它永远不会同时在两个线程上运行),但是如果除了该方法之外的任何也使用了namesMap
,然后不,总的来说这不是线程安全的:在decompile
方法中,在另一个线程上运行的另一个其他而不是decompile
的方法可以修改地图正在使用它,可能会造成混乱。 : - )
您可以查看java.util.concurrent
命名空间中的类(例如,ConcurrentHashMap
),看看是否有任何类适用于您正在做的事情。
修改(回复您的评论。)如果静态成员namesMap
仅由decompile
使用而不是其他任何内容(}你没有得到任何其他参考,等等,那么你没事。它是一个静态的事实并不重要,如果它使用的唯一地方是序列化的。
答案 1 :(得分:1)
如果上面描述的方法namesMap
正在运行,其他线程可能会对decompile(String, int, UintMap, Map)
进行更改,那么您应该复制传入的地图而不仅仅是分配参考。
Decompiler.namesMap= new HashMap<String, String>(namesMap);
如果其他线程有可能对地图中包含的元素进行更改,而不仅仅是地图本身的结构,那么您应该确保{{1}使用decompile()
的方法和其他线程由同一个锁保护。
答案 2 :(得分:0)
实际上Decompiler.namesMap=namesMap;
是唯一设置namesMap的地方
但是在代码中没有其他地方更改了namesMap .. 只读...
我想确保
String decompiled=decompile(source,flags,properties);
将使用相同的名称Map。
答案 3 :(得分:0)
只有一个namesMap,所以你不必担心它是否会使用相同的namesMap。它会。