JavaにおけるConcurrentHashMapの内部構造とスレッドセーフ実装

日常的な開発では、HashMapが広く使われていますが、そのデータ構造は配列+単方向連結リスト(JDK 1.8以降では、チェーン長が8を超えると赤黒木に変換)です。しかし、マルチスレッド環境下ではHashMapはスレッドセーフではなく、明示的な同期処理が必要です。 代わりにjava.util.Hashtableは同期化されたメソッドによりスレッドセーフを保証しますが、全体ロックによる ...

7月4日 21:58 投稿

Java 並行処理における LongAdder の内部構造と性能優位性

高並下におけるカウント処理の課題 JDK 1.8 において導入された LongAdder クラスは、マルチスレッド環境下でのカウンター処理を最適化するために設計された原子操作クラスです。従来の AtomicLong は CAS(Compare-And-Swap)命令を用いて非阻塞な原子性を実現しており、ロックベースの同期機構と比較して高性能ですが、極端に競合が激しいシーンでは性能低下が課題となり ...

6月14日 18:48 投稿

ブロッキングキューの仕組みと実装

生産者・消費者パターン 生産者と消費者は設計パターンの一つであり、このパターンでは両者が直接通信せず、共通のコンテナ(例:キュー)を介してやりとりを行うことによって、強結合を回避する。 生産者はデータを生成し、それをコンテナに投入するだけで、消費側の処理完了を待つ必要がない。 一方で、消費者はコンテナからデータを取り出すのみで、生産者と直接連携す ...

6月13日 17:23 投稿

ConcurrentHashMapのaddCountメソッドの動作解析

ConcurrentHashMapの内部処理の中で、要素数を管理するaddCountメソッドは非常に重要な役割を果たします。本稿では、このメソッドがどのように動作するのか、コードを交えて詳しく解説します。このメソッドは主にputValメソッドから呼び出されます。 ソースコードの動作分析 private final void addCount(long x, int check) { CounterCell[] as; long b, s; ...

5月23日 23:16 投稿