ThreadLocal クラスは、アクセス インターフェイスまたは get や set などのメソッドを提供する ThreadLocalVariable (スレッド ローカル変数) として理解できます。これらのメソッドは、変数を使用するスレッドごとに独立したコピーを保存するため、get は常に現在の実行位置を返します。スレッド set を呼び出すときに設定された最新の値。 ThreadLocal<T> は、そのスレッドに固有の値を保持する Map<Thread,T> オブジェクトを含むと考えることができます。
要約すると、マルチスレッドのリソース共有の問題に対して、同期機構は「時間を空間に交換する」という手法を採用しているのに対し、ThreadLocal は「空間を時間に交換する」という手法を採用しています。前者は、アクセスをキューに入れるさまざまなスレッドに変数のコピーのみを提供しますが、後者は各スレッドに変数のコピーを提供するため、相互に影響を与えることなく同時にアクセスできます。
モックスレッドローカル
次のようにコードをコピーします。
java.util.Collectionsをインポートします。
java.util.HashMapをインポートします。
java.util.Mapをインポートします。
パブリック クラス SimpleThreadLocal<T> {
private Map<Thread, T> valueMap = コレクション
.synchronizedMap(new HashMap<Thread, T>());
public void set(T newValue) {
valueMap.put(Thread.currentThread(), newValue); // ①キーはスレッドオブジェクト、値はこのスレッドの変数のコピー
}
public T get() {
スレッド currentThread = Thread.currentThread();
To = valueMap.get(currentThread); // ② このスレッドに対応する変数を返す
if (o == null && !valueMap.containsKey(currentThread)) { // ③Mapに存在しない場合はMapに入れて保存します。
o = 初期値();
valueMap.put(currentThread, o);
}
を返します。
}
パブリック void 削除() {
valueMap.remove(Thread.currentThread());
}
protected T 初期値() {
null を返します。
}
}
ユーティリティスレッドローカル
次のようにコードをコピーします。
クラス数 {
private SimpleThreadLocal<Integer> count = new SimpleThreadLocal<Integer>() {
@オーバーライド
protected IntegerInitialValue() {
0を返します。
}
};
public 整数増加() {
count.set(count.get() + 1);
count.get() を返します。
}
}
クラス TestThread は Runnable {を実装します
プライベートカウントカウント;
public TestThread(カウント count) {
this.count = カウント;
}
@オーバーライド
public void run() {
// TODO 自動生成されたメソッド スタブ
for (int i = 1; i <= 3; i++) {
System.out.println(Thread.currentThread().getName() + "/t" + i
+ "th/t" + count.increase());
}
}
}
パブリック クラス TestThreadLocal {
public static void main(String[] args) {
カウント count = new Count();
スレッド t1 = 新しいスレッド(新しい TestThread(カウント));
スレッド t2 = 新しいスレッド(新しい TestThread(count));
スレッド t3 = 新しいスレッド(新しい TestThread(count));
スレッド t4 = 新しいスレッド(新しい TestThread(count));
t1.start();
t2.start();
t3.start();
t4.start();
}
}
出力されたコピーコードは次のとおりです。
スレッド 0 1 番目 1
スレッド 0 2 番目 2
スレッド-0 3 番目 3
スレッド 3 1 番目 1
スレッド-1 1 番目 1
スレッド 1 2 番目 2
スレッド 2 1 番目 1
スレッド 1 3 番目 3
スレッド 3 2 番目 2
スレッド 3 3 番目 3
スレッド 2 2 番目 2
スレッド 2 3 番目 3