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();
          }

         }
     }

    }

だから私の質問は、各スレッドにかかる時間を測定し、それらすべての数値をConcurrentHashMapスレッドセーフにする方法があるかどうかです。

私の全体の更新操作はAtomicです。そして、私の操作全体がそうでない場合、これよりも優れたアプローチがあるかどうかを確認したかっただけですAtomic。私は主に探していlock free solutionます。

そして、すべてのスレッドがそこでタスクの実行を終了した後、このHistogramマップをとして作成したので、メインメソッドからこのマップを印刷しています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 に答える