threadLocal作用
- 当只有一个共享资源时,创建多个子线程,在没有处理的情况下,这些子线程肯定共同操作这一共享资源中的共享数据,在容易造成线程安全问题的同时,也会不符合一些开发情况的要求。
- 所以threadLocal的作用就是,将在共享资源类中运用ThreadLocal建立各线程自己独享的序列。是原本的共享资源,在每个线程中独立操作。
原理
threadLocal使用的是map键值对,threadLocal通过map集合,map(“当前线程”,值)将值与当前线程绑定,达到线程拥有各自独立的序列。
/*
* threadLocal通过map集合,map("当前线程",值)
*/
public class ThreadLocalTest {
public static void main(String[] args) {
Res res = new Res();
ThreadLocalDemo t1 = new ThreadLocalDemo(res);
ThreadLocalDemo t2 = new ThreadLocalDemo(res);
ThreadLocalDemo t3 = new ThreadLocalDemo(res);
t1.start();
t2.start();
t3.start();
}
}
class Res{
//private int count = 0;
/*
* 设置线程本地变量
*/
private ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
protected Integer initialValue() {
return 0 ;
};
};
public Integer getNum() {
Integer count = this.count.get() +1;
this.count.set(count);
return count;
}
}
class ThreadLocalDemo extends Thread{
private Res res;
public ThreadLocalDemo(Res res) {
this.res = res;
}
@Override
public void run() {
for (int i = 0; i <3; i++) {
System.out.println(getName()+"---i:"+i+"--count"+res.getNum());
}
}
}
res类中,原本使用普通int型定义数据,不能达到要求,故使用以上代码中的
private ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
protected Integer initialValue() {
return 0 ;
};
};
给数据,定义一个初始值。此时的count为一个threadLocal的对象,故在下列代码框中重新定义count变量,且用count对象get方法,获取value值。
public Integer getNum() {
Integer count = this.count.get() +1;
this.count.set(count);
return count;
}
- 以下试运行结果,每一个线程的count值,都为1,2,3;各线程独立的序列
Thread-2---i:0--count:1
Thread-1---i:0--count:1
Thread-0---i:0--count:1
Thread-1---i:1--count:2
Thread-2---i:1--count:2
Thread-2---i:2--count:3
Thread-1---i:2--count:3
Thread-0---i:1--count:2
Thread-0---i:2--count:3