我正在做一个与数据库建立连接的项目。我需要看看有多少次exception is happening
。我正在使用Multithreaded code
,这意味着多个线程将连接到数据库并插入数据库。因此,在某些时候连接可能会丢失,因此我们需要查看这些异常发生了多少次。
所以我写了一个下面的代码,在 catch 块中,我正在捕获异常并在每次有任何异常时增加一个计数器并将其放入ConcurrentHashMap
.
class Task implements Runnable {
public static final AtomicInteger counter_sql_exception = new AtomicInteger(0);
public static final AtomicInteger counter_exception = new AtomicInteger(0);
public static ConcurrentHashMap<String, Integer> exceptionMap = new ConcurrentHashMap<String, Integer>();
@Override
public void run() {
try {
//Make a db connection and then executing the SQL-
} catch (SQLException e) {
synchronized(this) {
exceptionMap.put(e.getCause().toString(), counter_sql_exception.incrementAndGet());
}
LOG.Error("Log Exception")
} catch (Exception e) {
synchronized(this) {
exceptionMap.put(e.getCause().toString(), counter_exception.incrementAndGet());
}
LOG.Error("Log Exception")
}
}
}
我的问题是 -今天我进行了一次代码审查,我的一位高级团队成员说,你不需要synchronized(this)
在exceptionMap
. catch block
我说是的,我们将需要,因为递增计数器是原子的。在映射中添加新值是原子的。但是在没有同步的情况下两者都不是原子的。他说ConurrentHashMap
会为你做这件事。
那么我是否需要synchronized(this)
阻止它exceptionMap
。如果不是那为什么?如果是,那么我应该向他引用什么理由。