2

以下は、スレッド ローカル変数を作成する例です。

private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
    @Override
    protected SimpleDateFormat initialValue()
    {
        return new SimpleDateFormat("yyyyMMdd HHmm");
    }
};

また、スレッドローカルを使用する2番目の方法

public class MyThreadLocal {

    public static final ThreadLocal userThreadLocal = new ThreadLocal();

    public static void set(Context user) {
        userThreadLocal.set(user);
    }

    public static void unset() {
        userThreadLocal.remove();
    }

    public static Context get() {
        return userThreadLocal.get();
    }
}

さて、以下の行はスレッドローカル変数を作成し、それは静的です。

public static final ThreadLocal userThreadLocal = new ThreadLocal();

クラスが JVM にロードされるたびに、静的変数が初期化されます。つまり、クラスがロードされると、1 つのオブジェクトが作成されます。

* *質問: *異なるスレッドが ThreadLocal 変数で Set または get を呼び出す場合、threadlocal オブジェクトのコピーはどのようにスレッドに渡されますか? *各スレッドが独自のオブジェクトを取得する方法は? クラスのロード時に 1 つのオブジェクトが作成された場合、これはどのように発生しますか?**

4

2 に答える 2

1

答えはThreadLocalのドキュメントに明確に記載されていると思います

要約すると、私は引用します

このクラスは、スレッド ローカル変数を提供します。これらの変数は、(get メソッドまたは set メソッドを介して) アクセスする各スレッドが独自の、独立して初期化された変数のコピーを持っているという点で、通常の変数とは異なります。ThreadLocal インスタンスは通常、状態をスレッド (ユーザー ID やトランザクション ID など) に関連付けるクラスのプライベートな静的フィールドです。

各スレッドは、スレッドが生きていて ThreadLocal インスタンスにアクセスできる限り、スレッドローカル変数のコピーへの暗黙的な参照を保持します。スレッドがなくなった後、スレッド ローカル インスタンスのすべてのコピーがガベージ コレクションの対象になります (これらのコピーへの他の参照が存在しない場合)。

これが明確になることを願っています。

于 2013-09-20T08:37:30.703 に答える