У меня есть код, из которого я пытаюсь получить экземпляр своего класса, поскольку я написал обертку около java.util.logging.Logger
.Неатомическое использование ошибки проверки/помехи во время статического анализа
Ниже фрагмент кода в моем ClientLogger
классе -
private static final Map<Class<?>, ClientLogger> s_classLoggers = new ConcurrentHashMap<Class<?>, ClientLogger>();
final private Logger m_logger;
private ClientLogger(final Class<?> caller) {
m_logger = Logger.getInstance(caller);
}
public static ClientLogger getInstance(final Class<?> klass) {
final ClientLogger result;
if (s_classLoggers.containsKey(klass)) {
result = s_classLoggers.get(klass);
} else {
result = new ClientLogger(klass);
s_classLoggers.put(klass, result);
}
return result;
}
И это так, как я его инициализации в моих классах, где я должен использовать мой выше регистратор -
private static final ClientLogger s_logger = ClientLogger.getInstance(TestLogger.class);
Теперь, когда я запускаю свой инструмент для статического анализа, есть жалобы -
Non-atomic use of check/put on this line s_classLoggers.put(klass, result);
в моем классе ClientLogger
, и я не уверен, почему? Что-то не так я здесь делаю?
UPDATE: -
Вот мой обновленный код -
private static final ConcurrentHashMap<Class<?>, ClientLogger> s_classLoggers = new ConcurrentHashMap<Class<?>, ClientLogger>();
public static ClientLogger getInstance(final Class<?> klass) {
final ClientLogger result;
result = new ClientLogger(klass);
s_classLoggers.putIfAbsent(klass, result);
return result;
}
Другой Update: -
private static final ConcurrentHashMap<Class<?>, ClientLogger> s_classLoggers = new ConcurrentHashMap<Class<?>, ClientLogger>();
public static ClientLogger getInstance(final Class<?> klass) {
ClientLogger result;
result = s_classLoggers.putIfAbsent(klass, new ClientLogger(klass));
if (result == null) {
result = new ClientLogger(klass);
}
return result;
}
С java 8 или изменить объявленный тип поля на 'ConcurrentHashMap'. –
Я не вижу 'putIfAbsent()' для 's_classLoggers' карты. Не знаете почему? И я использую 'java.util.concurrent.ConcurrentHashMap' – john
@ user2809564: вам нужно изменить тип поля на' ConcurrentHashMap '. –
SLaks