4

ThreadLocal.get/put との違いは何ですか

class ThreadT extends Thread {
private SomeObj obj;
.....
}

私が間違っている場合は修正してください。このオブジェクトもスレッドごとに異なります。つまり、ThreadT のオブジェクトが 5 つある場合、それぞれ 5 つのオブジェクトが異なる obj オブジェクトを持つことになります。

この場合、なぜ を使用する必要があるのThreadLocalでしょうか?

2 つのいずれかについての私の理解が間違っている場合は、訂正してください。

4

3 に答える 3

6

ドキュメントから

This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable.

スレッドを直接拡張するクラスを作成している場合、このアプローチは機能します。しかし、ThreadLocal 変数を必要とするが、その Thread インスタンスに直接アクセスできないクラスはどうでしょうか?

そのような場合、ThreadLocal が役立ちます。特に、ほとんどの場合スレッドを直接使用しないサーバー環境では。

于 2013-05-07T04:41:58.570 に答える
3

クラスが Thread を拡張するという事実は、そのフィールドを特別なものにしません。クラスにget / setメソッドがあると仮定します

    final ThreadT tt = new ThreadT();

    new Thread() {
        public void run() {
            tt.set(new Object());
        };
    }.start();

    new Thread() {
        public void run() {
            Object obj = tt.get();
        };
    }.start();

2 番目のスレッドは、最初のスレッドが配置したオブジェクトを取得します。ThreadLocal では起こりません

于 2013-05-07T04:42:21.410 に答える
0

プログラムを書きました

class ThreadRun implements Runnable {

    NumberValue number;
    int value;

    ThreadRun(NumberValue number,int value) {


        this.number=number;
        this.value = value;
        Thread t = new Thread(this);
        t.start();
    }

    @Override
    public void run() {

        number = number.getThreadLocal();


        number.setId(number.getId()+value);

        System.out.println(number.getId());

    }

}

public class ThreadTest {
    public static void main(String[] args) {
        NumberValue number = new NumberValue(1);


        new ThreadRun(number, 1);
        new ThreadRun(number, 2);
    }
}

class NumberValue {

    int id;



    ThreadLocal<NumberValue> threadLocal = new ThreadLocal<NumberValue>() {

    @Override
    protected NumberValue initialValue() {

        return new NumberValue(id);
    }
    };



    NumberValue(int id) {
        this.id = id;

    }



    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
    public NumberValue getThreadLocal() {
        return threadLocal.get();
    }






}

output: 2 3 この出力は、予想される出力です

でもコメントすると

// number = number.getThreadLocal(); 実行プログラムの出力は次のようになります。 3 4 // number = number.getThreadLocal(); の場合、データは破損しています。がコメントされています。したがって、threadlocal は NumberValue のローカル コピーを作成します。しかし、threadlocal が使用されていない場合、同じオブジェクト インスタンスがスレッド間で共有されるため、データの結果は実際の結果よりも破損しています。

于 2013-05-07T05:37:23.883 に答える