Java静态和线程安全或做什么

时间:2010-04-20 16:23:53

标签: java thread-safety

我正在扩展图书馆为我做一些工作。这是代码:

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变量可能会改变。我能为此做些什么?

4 个答案:

答案 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。它会。