2010-04-20 29 views
3

我正在扩展一个库来为我做一些工作。这里是代码:Java静态和线程安全性或做什么

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

是否在代码中的其他地方访问了namesMap?如果是这样,你能举一个具体的例子吗? – Finbarr 2010-04-20 16:26:03

+0

它会从另一个反编译()只访问.. – GorillaApe 2010-04-20 16:27:18

回答

5

方法decompile是线程安全的(它永远不会被两个线程同时运行),但如果什么除此之外方法也使用namesMap,则没有,总体而言,这不是线程安全的:另一种方法其他decompile运行在不同的线程可以修改地图而decompile方法正在使用它,大概造成混乱。 :-)

您可以查看java.util.concurrent命名空间中的类(例如,ConcurrentHashMap),以查看这些类中的任何一个是否适用于您正在执行的操作。

编辑(响应您的评论。)如果静态成员namesMap只用过通过decompile,而不是由其他任何(你不会对它的引用到别的,等等),那么你很好。它是一个静态的事实并不重要,如果它唯一使用的地方是序列化的。

+0

而且“* only ever used *”意味着有一天,另一个开发人员会忘记这个隐式的需求,并在别处使用它,你会得到虚假的错误。 – 2010-04-20 16:32:46

+0

如果仅在一个地方使用静态成员'namesMap',为什么不将其从静态成员更改为方法参数呢?这样你可以消除所有疑问。 – 2010-04-20 16:50:09

+0

@Aaron:绝对。 – 2010-04-20 16:56:03

1

如果有其他线程在如上所述的方法正在运行的情况下对namesMap进行更改的机会,那么您应该制作传入地图的副本,而不是仅分配参考。

Decompiler.namesMap= new HashMap<String, String>(namesMap); 

如果有机会的话,其他线程将更改包含在地图内的元素,而不仅仅是地图本身的结构,那么你应该确保你的decompile()法和其他使用namesMap的线程由相同的锁保护。

0

其实Decompiler.namesMap=namesMap; 是设置namesMap

但无处可在namesMap改变的代码.. 只读我想确保的唯一的地方...

String decompiled=decompile(source,flags,properties); 

将使用相同的名称映射。

0

只会有一个名称映射,所以您不必担心它是否使用相同的名称映射。它会。