【发布时间】:2013-02-12 01:32:09
【问题描述】:
我正在做一个与数据库建立连接的项目。如果有的话,我需要查看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")
}
}
}
我的问题是- 今天我进行了一次代码审查,我的一位高级团队成员说,catch block 中的exceptionMap 上的synchronized(this) 是不需要的。我说是的,我们将需要,因为递增计数器是原子的。在映射中添加新值是原子的。但是在没有同步的情况下两者都不是原子的。他说ConurrentHashMap会为你做这件事。
那么我是否需要synchronized(this) 阻止exceptionMap。如果不是那为什么?如果是,那么我应该向他引用什么理由。
【问题讨论】:
-
您是要计算所有正在发生的异常,还是每个异常发生的次数?
-
每个异常发生的次数。
-
那你为什么要使用一个共享计数器?
-
对不起,让我更新我的问题。我没有使用共享计数器。当我发布问题时,我错误地只复制了计数器。
-
刚刚更新了问题。
标签: java database multithreading concurrency atomic