ThreadLocal vs线程局部变量



ThreadLocal.get/put的差异是什么和

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

我相信,如果我错了,请纠正我,这个对象也会为每个线程不同。也就是说,如果我们有thread的5个对象,我们将让它们中的每5个都有obj的不同对象。

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

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

从文档

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变量但不能直接访问它的线程实例的类怎么办?

在这种情况下,ThreadLocal是有用的。

您的类扩展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
就不会发生这种情况

我写过程序

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



}

输出:23.这个输出是我们期望的输出

但是当你注释

//number = number. getthreadlocal ();而运行程序的输出将是输出:3.4所以当//number = number. getthreadlocal ();是评论。但是当threadlocal不被使用时,相同的对象实例在线程之间共享,所以数据结果比实际结果损坏

最新更新