4

ThreadLocal.get/put 和有什么区别

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

我相信,如果我错了,请纠正我,这个 obj 对于每个线程也会有所不同。即,如果我们有 5 个 ThreadT 对象,我们将让它们中的每五个都有不同的 obj 对象。

那么如果是这样的话,那我们为什么还需要使用ThreadLocal呢?

如果我对两者中的任何一个的理解不正确,请纠正我。

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();

第二个线程将获取第一个线程放置的对象。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 回答