public class ThreadLocalTest {
/**
* ThreadLocal提供了线程本地变量,它可以保证访问到的变量属于当前线程,
* 每个线程都保存有一个变量副本,每个线程的变量都不同。
* ThreadLocal相当于提供了一种线程隔离,将变量与线程相绑定
*/
ThreadLocal<Long> longLocal = new ThreadLocal<Long>();
//Integer i = 0;
public void set(long x) {
//this.i = x;
longLocal.set(x);
}
public long getLong() {
return longLocal.get();
//return i;
}
public static void main(String[] args) throws InterruptedException {
final ThreadLocalTest test = new ThreadLocalTest();
//main线程复制
test.set(10);
Thread thread1 = new Thread(){
public void run() {
//线程1赋值
test.set(20);
System.out.println("线程一:"+test.getLong());
};
};
thread1.start();
thread1.join();
System.out.println("main线程输出:"+test.getLong());
System.out.println("没有发生值的覆盖,两个线程保存的值是不同的");
}
}
控制台输出:
线程一:20
main线程输出:10
没有发生值的覆盖,两个线程保存的值是不同的
因为每个线程只保存自己的副本, 你可以换Integer试一下, 就能看出区别了