我正在尝试测量每个线程插入数据库所花费的时间。我已经在名为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
答案 0 :(得分:1)
你的代码是正确的;还有一个(更复杂的)习惯用法,每次都避免实例化AtomicLong
。但请注意,由于关键部分的持续时间非常短,基于锁定的“天真”解决方案可能同样出色。