スレッド間でデータを保持するための ThreadLocal の使い方は?

スレッドローカルは、多重スレッド環境で変数をカレントスレッドに関連付け、スレッド間のデータ分離を実現するために、Javaが提供するスレッドローカル変数用ユーティリティクラスだ。

ThreadLocal変数の値を異なるスレッド間でやり取りしたい場合は、以下の2つの方法で実現できます。

  1. スレッド間に値を共有できるThreadLocalのサブクラスであるInheritableThreadLocalで共有できます。スレッドが子スレッドを作成すると、子スレッドは親スレッドのInheritableThreadLocal変数の値を継承します。InheritableThreadLocalを使用する際は、子スレッドの作成前に親スレッドでInheritableThreadLocal変数の値を設定する必要があることに注意してください。

下記にサンプルコードを示します。

static ThreadLocal<String> threadLocal = new InheritableThreadLocal<>();
public static void main(String[] args) {
threadLocal.set("Hello");
Thread thread = new Thread(() -> {
System.out.println(threadLocal.get());  // 输出Hello
});
thread.start();
}
  1. ThreadLocalの変数の値を異なるスレッド間で手動で受け渡すには、ThreadLocalの値を渡す方法があります。たとえば、あるスレッドでThreadLocalから変数の値を取得し、その値を別のスレッドに渡します。

次の例を参照してください。

static ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void main(String[] args) {
threadLocal.set("Hello");
Thread thread = new Thread(() -> {
String value = threadLocal.get();
System.out.println(value);  // 输出Hello(通过传递ThreadLocal的值)
});
thread.start();
}

スレッド間で ThreadLocal を活用して変数をやり取りする際は、スレッド間の同期と可視性の確保することで、データ不整合を避ける必要があることに注意しましょう。

bannerAds