ThreadLocal简介

如果希望所有线程都使用同一个变量,但是每一个线程在使用这个变量的时候,都能维护自己的值,应该怎么办?ThreadLocal就能实现这个功能。
先看一下代码
final static ThreadLocal threadLocal = new ThreadLocal();
public static void main(String[] args) {
for (int i=0;i<3;i++){
Thread thread =new Thread(new RClass2(threadLocal));
thread.start();
}
}
}
class RClass2 implements Runnable{
ThreadLocal threadLocal;
RClass2(ThreadLocal threadLocal){
this.threadLocal = threadLocal;
}
@Override
public void run() {
for (int i=0;i<3;i++){
threadLocal.set(i);
System.out.println(Thread.currentThread().getName()+"/" +threadLocal.get()+threadLocal);
}
}
运行后的结果
Thread-2/0/java.lang.ThreadLocal@d9d8ad0
Thread-2/1/java.lang.ThreadLocal@d9d8ad0
Thread-2/2/java.lang.ThreadLocal@d9d8ad0
Thread-0/0/java.lang.ThreadLocal@d9d8ad0
Thread-0/1/java.lang.ThreadLocal@d9d8ad0
Thread-0/2/java.lang.ThreadLocal@d9d8ad0
Thread-1/0/java.lang.ThreadLocal@d9d8ad0
Thread-1/1/java.lang.ThreadLocal@d9d8ad0
Thread-1/2/java.lang.ThreadLocal@d9d8ad0

可以看到,每一个threadLocal都是同一个对象,但是线程内部对于threadLocal的维护是独立完成的,相互之前不干扰,Thread-1的累加不会影响到Thread-2,就是所说的线程隔离,相对应的,volatile就是线程间数据共享。

原理介绍,ThreadLocal内部有个ThreadLocalMap,然后用线程的ID作为Map的key,实例对象作为Map的value,这样就能达到各个线程的值隔离的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值