Java での ThreadLocal の概要

Muhammad Adil 2023年12月11日
  1. ThreadLocal 変数の主な用途
  2. Java で ThreadLocal を使用するには
Java での ThreadLocal の概要

ThreadLocal は Java 言語の強力なツールで、開発者は実行の各スレッドに固有の変数を作成できます。 これは、他のスレッドの同じ変数の値とは関係なく、各スレッドが変数のコピーを持つことを意味します。

これは、特定の変数に対して異なるスレッドが異なる要件を持ち、あるスレッドでの変数の値の変更が別のスレッドの同じ変数の値に影響を与えてはならないマルチスレッド アプリケーションで特に役立ちます。

ThreadLocal 変数の主な用途

ThreadLocal の主な使用例は、単一のリクエストに固有であり、異なるリクエスト間で共有されるべきではない、ユーザー ID やトランザクション ID などのスレッドごとの状態を保存することです。

たとえば、単一のデータベース接続を使用して複数のユーザー要求を処理する Web アプリケーションを考えてみましょう。 ThreadLocal がなければ、複数のリクエストが異なるスレッドによって同時に実行され、互いに干渉する可能性があるため、各リクエストが正しいユーザー情報を使用することを保証することは困難です。

ThreadLocal を使用すると、各スレッドはユーザー情報を保存できます。この情報は、そのスレッドに関連付けられたデータベース接続で使用されます。

Java で ThreadLocal を使用するには

Java で ThreadLocal を使用するには、ThreadLocal クラスの新しいインスタンスを宣言し、その get() および set() メソッドを使用して、現在のスレッドに関連付けられた値にアクセスして変更します。

たとえば、次のコードは、ThreadLocal を使用して各スレッドのユーザー ID を格納する方法を示しています。

public class Main {
  public static void main(String args[]) {
    ThreadLocal<Integer> localVariable = new ThreadLocal<>();
    localVariable.set(10);
    // get the value for the current thread
    System.out.println("Value of localVariable in current thread: " + localVariable.get());
  }
}

ThreadLocal 変数を作成すると、それにアクセスする各スレッドは変数の個別のインスタンスを持ちます。 これは、各スレッドが同じ ThreadLocal 変数に異なる値を格納できることを意味し、変数にアクセスすると、その特定のスレッドに設定された値が取得されます。

これは、スレッド間で共有されるべきではないスレッド固有のデータを格納する必要があるマルチスレッド環境で役立ちます。

たとえば、ThreadLocal 変数を使用して、特定のスレッドのユーザー ID やトランザクション ID などの情報を格納し、複数のスレッドが同時に実行されている場合でも、そのスレッドのデータを追跡できます。

ThreadLocal は、それを作成したスレッドが終了したときに、その値を自動的に削除しないことに注意することが重要です。 これにより、終了したスレッドに関連付けられた値が引き続きメモリを占有するため、メモリ リークが発生する可能性があります。

これを回避するには、ThreadLocal クラスの remove() メソッドを使用するか、Java 7 以降で try-with-resources ステートメントを使用することをお勧めします。 例えば:

try (ThreadLocalCleanup cleanup = new ThreadLocalCleanup(userId)) {
  // use the ThreadLocal variable here
}

この例では、ThreadLocalCleanup クラスは AutoCloseable インターフェイスを実装しており、try-with-resources ステートメントで使用できます。

try-with-resources ステートメントが終了すると、ThreadLocalCleanup クラスの close() メソッドが自動的に呼び出され、現在のスレッドに関連付けられている値が ThreadLocal 変数から削除されます。

ここをクリック 上記のコードの動作を確認します。

著者: Muhammad Adil
Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook

関連記事 - Java Thread