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