我有一段代码,我试图从中获取我的类的实例,因为我已经编写了一个围绕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
类中,我不知道为什么?我在这里有什么问题吗?
更新: -
这是我更新的代码 -
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;
}
另一个更新: -
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'。 – 2014-09-30 00:45:40
我看不到's_classLoggers'地图的'putIfAbsent()'。不知道为什么?我正在使用'java.util.concurrent.ConcurrentHashMap' – john 2014-09-30 00:47:23
@ user2809564:您需要将该字段的类型更改为'ConcurrentHashMap'。 –
SLaks
2014-09-30 00:48:42