我正在扩展一个库,为我做一些工作。代码如下:
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变量可能会改变。我能为此做些什么呢?
发布于 2010-04-21 00:26:47
方法decompile是线程安全的(它永远不会同时在两个线程上运行),但是如果除该方法之外的任何其他方法也使用namesMap,则不,总的来说这不是线程安全的:运行在不同线程上的decompile以外的另一个方法可能会在decompile方法使用映射时修改它,这可能会造成混乱。:-)
您可以查看java.util.concurrent名称空间(例如,ConcurrentHashMap)中的类,看看其中是否有适用于您正在执行的操作的类。
编辑(回复您的评论。)如果静态成员namesMap只由decompile使用,而不是由其他任何人使用(您不会获得对它的引用,等等),那么就没问题了。事实上它是一个静态变量并不重要,如果它唯一被使用的地方是序列化的。
发布于 2010-04-21 00:28:12
如果在上面描述的decompile(String, int, UintMap, Map)方法运行时,其他线程有可能对namesMap进行更改,那么您应该对传入的映射进行复制,而不只是分配一个引用。
Decompiler.namesMap= new HashMap<String, String>(namesMap);如果其他线程有可能对映射中包含的元素进行更改,而不仅仅是映射本身的结构,那么您应该确保您的decompile()方法和使用namesMap的其他线程受到相同锁的保护。
发布于 2010-04-21 00:35:25
实际上,Decompiler.namesMap=namesMap;是设置namesMap的唯一位置
但是在代码的其他地方,namesMap并没有改变。只读...
我想要确保
String decompiled=decompile(source,flags,properties);会使用相同的namesMap。
https://stackoverflow.com/questions/2676829
复制相似问题