Java static и потокобезопасность или что делать



Я расширяю библиотеку, чтобы сделать для меня кое-какую работу. Вот код:



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 может измениться. Что я могу для этого сделать?

617   4  

4 ответов:

Метод decompile является потокобезопасным (он никогда не будет работать на двух потоках одновременно), но если что-либо, кроме этого метода, также использует namesMap, то нет, в целом это не потокобезопасно: другой метод , отличный от, работающий на другом потоке, может изменить карту, пока метод decompile использует его, предположительно вызывая хаос. :- )

Вы можете посмотреть на классы в java.util.concurrent пространство имен (например, ConcurrentHashMap) чтобы увидеть если что-то из этого применимо к тому, что вы делаете.

Edit (отвечая на ваш комментарий.) Если статический член namesMap используется только decompile, а не чем-либо другим (вы не получаете ссылку на него ни на что другое и т. д.), тогда все в порядке. Тот факт, что это статика, не имеет значения, если единственное место, где она используется, сериализовано.

Если есть вероятность, что другие потоки внесут изменения в namesMap во время выполнения метода decompile(String, int, UintMap, Map), как описано выше, то вы должны сделать копию переданной карты, а не просто назначить ссылку.

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

Если есть вероятность того, что другие потоки внесут изменения в элементы, содержащиеся в карте, а не только в структуру самой карты , то вы должны убедиться, что ваш метод decompile() и другие потоки, использующие namesMap, защищены тот же замок.

На самом деле Decompiler.namesMap=namesMap; является единственным местом для установки namesMap

Но больше нигде в коде карта имен не изменяется.. Только читать...

Я хочу убедиться, что

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

Будет использовать ту же карту имен.

Будет только одна карта имен, поэтому вам не нужно беспокоиться, будет ли она использовать ту же самую карту имен. Это был бы.

Comments

    Ничего не найдено.