JavaのThreadLocalクラスを使用すると、同じスレッドでのみ読み書きできる変数を作成できます。したがって、コードの一部にThreadLocal変数への参照が含まれている場合、2つのスレッドがこのコードを同時に実行しても、お互いのThreadLocal変数にアクセスすることはできません。
ThreadLocal変数の作成方法
次のコードは、ThreadLocal変数を作成する方法を示しています。
private ThreadLocal myThreadLocal = new ThreadLocal();
このコードを通じてThreadLocalオブジェクトがインスタンス化されていることがわかります。オブジェクトをインスタンス化する必要があるのは1回だけであり、インスタンス化されたスレッドを知る必要はありません。すべてのスレッドがこのThreadLocalインスタンスにアクセスできますが、各スレッドはThreadLocalのset()メソッドを呼び出して値セットにのみアクセスできます。2つの異なるスレッドが同じThreadLocalオブジェクトに異なる値を設定していても、お互いの値にアクセスすることはできません。
ThreadLocal変数にアクセスする方法
ThreadLocal変数が作成されたら、次のコードで保存する必要がある値を設定できます。
myThreadLocal.set("A thread local value”);
ThreadLocal変数に格納されている値は、次のメソッドで読み取ることができます。
String threadLocalValue = (String) myThreadLocal.get();
get()メソッドはObjectオブジェクトを返し、set()オブジェクトはObject型パラメーターを渡す必要があります。
ThreadLocalのジェネリック型を指定します
ジェネリック型を指定するThreadLocalオブジェクトを作成できるため、毎回get()メソッドによって返される値をキャストする必要はありません。ジェネリック型を指定するThreadLocalの例を次に示します。
private ThreadLocal myThreadLocal = new ThreadLocal<String>();
これで、ThreadLocalオブジェクトに格納できるのは文字列型の値のみです。
ThreadLocalから値を取得する場合、キャストする必要はありません。
ThreadLocal変数の値を初期化する方法
ThreadLocalオブジェクトに設定された値は、その値を設定するスレッドからのみアクセスできるため、スレッドはThreadLocalオブジェクトのset()メソッドを使用して初期値を保存できず、この初期値にはすべてのスレッドがアクセスできます。
ただし、ThreadLocalのサブクラスを作成し、initialValue()メソッドをオーバーライドすることで、ThreadLocalオブジェクトの初期値を指定できます。次のコードに示すように:
private ThreadLocal myThreadLocal = new ThreadLocal<String>() {
@Override
protected String initialValue() {
return "This is the initial value";
}
};
完全なThreadLocalの例
以下は、実行可能な完全なThreadLocalの例です。
public class ThreadLocalExample {
public static class MyRunnable implements Runnable {
private ThreadLocal threadLocal = new ThreadLocal();
@Override
public void run() {
threadLocal.set((int) (Math.random() * 100D));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
System.out.println(threadLocal.get());
}
}
public static void main(String[] args) {
MyRunnable sharedRunnableInstance = new MyRunnable();
Thread thread1 = new Thread(sharedRunnableInstance);
Thread thread2 = new Thread(sharedRunnableInstance);
thread1.start();
thread2.start();
}
}
上記の例では、MyRunnableのインスタンスを作成し、そのインスタンスをパラメーターとして2つのスレッドに渡します。2つのスレッドはrun()メソッドを個別に実行し、どちらもThreadLocalインスタンスに異なる値を保存します。それらがThreadLocalオブジェクトにアクセスしておらず、それらが呼び出すset()メソッドが同期されている場合、2番目のスレッドは最初のスレッドによって設定された値を上書きします。ただし、それらはThreadLocalオブジェクトにアクセスしているため、どちらのスレッドも他方が保存した値を見ることができません。つまり、2つの異なる値にアクセスします。
InheritableThreadLocalについて
InheritableThreadLocalクラスは、ThreadLocalクラスのサブクラスです。ThreadLocalの各スレッドには独自の値があります。ThreadLocalとは異なり、InheritableThreadLocalでは、スレッドと、そのスレッドによって作成されたすべての子スレッドが保存された値にアクセスできます。
やっと
プライベートメッセージでデータに返信して、主要メーカーからのJavaインタビューの質問の概要+ Alibaba Taishanマニュアル+ナレッジポイントの学習ガイド+ 300ページのPDF文書のJavaコアナレッジポイントの概要を受け取る!
これらの資料の内容は、インタビュアーが面接中に尋ねる必要があるすべての知識ポイントです。この章には、基本的な知識、Javaコレクション、JVM、マルチスレッド同時実行性、Spring原則、マイクロサービス、NettyおよびRPC、Kafkaなどの多くの知識ポイントが含まれています、日記、デザインパターン、Javaアルゴリズム、データベース、Zookeeper、分散キャッシュ、データ構造など。