とあるマイクロサービスにスレッドセーフな連想カウンタを仕込みたくなったので、ここのところ格闘していました。要件はこんな感じです。 リクエストごとに様々なキーのカウント値をインクリメントする 定期的に全キーのカウント値をログ出力して0にリセットする インクリメントされなくなったキーをメモリに保持しつづけない フレームワークとして使っている Finagle の mterics 機能を初めに検討したのですが、リセットする方法がなさそうだったのと、数十万個のキーを登録するようなものではなさそうだったので、自前で作ることにしました。 ということで Java のスレッドセーフな連想配列 ConcurrentHashMap のドキュメントを見てみると ConcurrentHashMapは、LongAdderの値を使用し、computeIfAbsentで初期化することにより、スケーラブルな頻度マップ(ヒス