データベースに接続するプロジェクトに取り組んでいます。そして、もしあれば何回見る必要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")
}
}
}
私の質問は - 今日、私はコード レビューを行い、私の上級チーム メンバーの 1 人が、あなたは必要ないと言っsynchronized(this)
ていexceptionMap
ましたcatch block
。カウンターのインクリメントはアトミックであるため、必要になると私は言いました。マップに新しい値を入れることはアトミックです。しかし、同期せずに両方を行うことはアトミックではありません。そして彼はConurrentHashMap
あなたのためにこれをすると言った。
それで、私はそれをsynchronized(this)
ブロックする必要がありexceptionMap
ますか?そうでない場合、なぜですか?はいの場合、どのような理由を彼に引用する必要がありますか.