0

我正在尝试测量每个线程插入数据库所需的时间。我已经以每个线程在插入时所花费的时间的ConcurrentHashMap名称捕获了所有这些性能数字。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();
          }

         }
     }

    }

所以我的问题是我试图测量每个线程花费多少时间并将所有这些数字存储在 a 中的ConcurrentHashMap方式是否是线程安全的?

我认为我的整个更新操作是Atomic. 我只是想看看如果我的整个操作没有,是否有比这更好的方法Atomic。我主要在找lock free solution

然后在每个线程完成执行任务后,我Histogram从 main 方法打印这个映射,因为我已经将该映射设置为Static. 那么这种方式对不对?

public class LoadTest {

public static void main(String[] args) {

//executing all the threads using ExecutorService


//And then I am printing out the historgram that got created in Task class    
System.out.println(Task.histogram);

     }

}
4

1 回答 1

1

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

于 2013-02-08T20:42:56.190 回答