ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内。ThreadLocal为解决多线程程序的并发问题提供了一种新的思路ThreadLocal的目的是为了解决多线程访问资源时的共享问题.ThreadLocal不是一个线程而是一个线程的本地化对象。当工作于多线程环境中的对象采用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的副本。每个线程都可以独立的改变自己的副本,而不影响其他线程的副本。
测试案例:
public class ThreadData {
private static int data;
public static void main(String[] args) {
//创建两个线程修改变量
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
data = new Random().nextInt(50)+100;
System.out.println("ThreadData---------data=" +data);
new AccountA().getData();
new AccountB().getData();
}
}).start();
}
}
static class AccountA {
public void getData() {
System.out.println("AccountA---->" + Thread.currentThread().getName() + "-----data=" + data);
}
}
static class AccountB {
public void getData() {
System.out.println("AccountB---->" + Thread.currentThread().getName() + "-----data=" + data);
}
}
}
ThreadData---------data=147
ThreadData---------data=147
AccountA---->Thread-0-----data=147
AccountA---->Thread-1-----data=147
AccountB---->Thread-0-----data=147
AccountB---->Thread-1-----data=147
通过了控制台打印可以知道,数据公用变量出现混乱,所以解决此类问题TheadLocal便横空出世,通过map的方式保存当前线程的变量值
public class ThreadData {
private static int data;
private static ThreadLocal<Integer> threadLocal=new ThreadLocal<Integer>();
public static void main(String[] args) {
//创建两个线程修改变量
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
data = new Random().nextInt(50)+100;
threadLocal.set(data);
System.out.println("ThreadData---------data=" +threadLocal.get());
new AccountA().getData();
new AccountB().getData();
}
}).start();
}
}
static class AccountA {
public void getData() {
System.out.println("AccountA---->" + Thread.currentThread().getName() + "-----data=" + threadLocal.get());
}
}
static class AccountB {
public void getData() {
System.out.println("AccountB---->" + Thread.currentThread().getName() + "-----data=" + threadLocal.get());
}
}
}
ThreadData---------data=114
ThreadData---------data=132
AccountA---->Thread-1-----data=114
AccountA---->Thread-0-----data=132
AccountB---->Thread-1-----data=114
AccountB---->Thread-0-----data=132