ThreadLocal与线程局部变量

时间:2013-05-07 04:33:46

标签: java multithreading

ThreadLocal.get/put有什么区别 和

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

我相信,如果我错了,请纠正我,对于每个帖子,这个obj也会有所不同。也就是说,如果我们有5个ThreadT对象,我们将使每个对象具有不同的obj对象。

如果是这种情况,那么为什么我们需要使用ThreadLocal

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

3 个答案:

答案 0 :(得分: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很有用。特别是在大多数情况下不直接使用线程的服务器环境中。

答案 1 :(得分: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

答案 2 :(得分: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();
    }






}

输出: 2 3 此输出是我们的预期输出

但是当你发表评论时

// number = number.getThreadLocal();并运行程序输出 输出:  3  4 所以// number = number.getThreadLocal()时数据被破坏了;注释。所以threadlocal生成NumberValue的本地副本。但是当没有使用threadlocal时,线程之间共享相同的对象实例,因此数据结果比actaul结果损坏