JavaでのThreadLocal分析

1598 ワード

ThreadLocalはThreadではなく、スレッドのローカル変数であり、ThreadLocalを使用して変数を維持する場合、ThreadLocalはその変数を使用するスレッドごとに独立した変数のコピーを提供するので、他のスレッドに対応するコピーに影響を与えることなく、各スレッドは独立して自分のコピーを変更することができます.
ThreadLocalクラスのインタフェースは簡単で、主に以下の4つの方法を含んでいます.
(1)public void set(T value);
現在のスレッドのローカル変数値を設定します.
2)public T get();
現在のスレッドのローカル変数値を取得します.
3)public void  remove();
メモリの使用量を減らすために、現在のスレッドのローカル変数値を削除します.
4)protected T initValue();
スレッドのローカル変数の初期値を返します.
ThreadLocalはどのようにして各スレッドに独立したコピー値を提供するのでしょうか.実装プロセスは簡単です.以下は私自身が実装した簡単なバージョンです.
package com.test;

import java.util.Collections;
import java.util.HashMap;

public class SimpleThreadLocal {
	private HashMap map=(HashMap) Collections.synchronizedMap(new HashMap());
	
	public void set(T value){
		Thread thread =Thread.currentThread();
		map.put(thread, value);
	}
	
	public T get(){
		Thread thread =Thread.currentThread();
		Object o=map.get(thread);
		if(o==null&&map.containsKey(thread)){
			map.put(thread, initValue());
		}
		return (T) o;
	}
	
	public void remove(){
		map.remove(Thread.currentThread());
	}
	protected T initValue(){
		return null;
	}
}
ThreadLocalと同期メカニズムの比較
ThreadLocalとスレッドの同期は、マルチスレッド内の同じ変数へのアクセス競合の問題を解決するためです.
同期メカニズムでは、オブジェクトのロックメカニズムによって、同じ時間に1つのスレッドのみが変数にアクセスすることを保証します.これは、この変数が複数のスレッドで共有されているため、同期メカニズムを使用して、プログラムが変数をいつ読み書きするか、いつオブジェクトをロックする必要があるか、いつオブジェクトロックを解放するかを分析することが要求され、プログラム設計の難易度が増加します.
一方、ThreadLocalは別の角度からマルチスレッドの問題を解決します.ThreadLocalは、各スレッドに独立した変数コピーを提供し、マルチスレッドによるデータへの干渉を分離します.
要約すると、同期機構は時間で空間を取り替える方式であり、ThreadLocalは時間を空間で取り替える方式である.