ThreadLocal
1、ThreadLocal本地线程,可以设置属于当前线程自己的局部变量。
2、ThreadLocal可以让不同的线程之间对局部变量的修改互不影响
3、ThreadLocal的本质是Map集合,以当前线程为Key,局部变量为value
代码
如果没有使用ThreadLocal,getNum()得到的值会存在6,而我们代码中getNum()最大的值也只有3,这就是线程安全问题。。。
使用ThreadLocal可以避免此类线程安全问题的发生。
package cn.zyyyx.demo;
import java.util.concurrent.atomic.AtomicInteger;
class Res{
//private int count = 0 ;
//创建一个ThreadLocal,并且初始化值
ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){
@Override
protected Integer initialValue() {
return 0;
}
};
public int getNum(){
//定义一个局部变量,从以当前线程为key,取值
int count = threadLocal.get() + 1;
//将修改后的值存入到ThreadLocal中
threadLocal.set(count);
return count;
}
}
class CreateThread1 extends Thread{
private Res res;
public CreateThread1(Res res) {
this.res = res;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName()+"i="+i+"---number"+res.getNum());
}
}
}
public class ThreadSecured {
public static void main(String[] args) throws InterruptedException {
Res res = new Res();
CreateThread1 c = new CreateThread1(res);
CreateThread1 c1 = new CreateThread1(res);
c.start();
c1.start();
}
}