在更新地图并阅读时锁定免费解决方案

时间:2013-02-08 20:27:11

标签: java database concurrency atomicity concurrenthashmap

我正在尝试测量每个线程插入数据库所花费的时间。我已经在名为ConcurrentHashMap的{​​{1}}中捕获了所有这些性能数字,例如每个线程插入的时间。

下面是我测量每个线程花费多少时间并将其存储在histogram

中的代码
ConcurrentHashMap

所以我的问题是,我试图衡量每个线程花费多少时间以及将所有这些数字存储在class Task implements Runnable { public static ConcurrentHashMap<Long, AtomicLong> histogram = new ConcurrentHashMap<Long, AtomicLong>(); @Override public void run() { try { long start = System.nanoTime(); preparedStatement.executeUpdate(); // flush the records. long end = System.nanoTime() - start; final AtomicLong before = histogram.putIfAbsent(end / 1000000, new AtomicLong(1L)); if (before != null) { before.incrementAndGet(); } } } } 中的方式是否是线程安全的?

我认为我的整个更新操作是ConcurrentHashMap。我只想知道如果我的整个操作不是Atomic,是否有更好的方法。我主要是寻找Atomic

然后在每个线程完成执行任务后,我将从主方法打印此lock free solution地图,因为我将该地图设为Histogram。所以这种方式是对还是没有?

Static

1 个答案:

答案 0 :(得分:1)

你的代码是正确的;还有一个(更复杂的)习惯用法,每次都避免实例化AtomicLong。但请注意,由于关键部分的持续时间非常短,基于锁定的“天真”解决方案可能同样出色。