深入理解ThreadLocal
1、什么是ThreadLocal ?
ThreadLocal 是一个用来为每一个线程保持一份公共变量的值(注意:这个值是和线程绑定的,每个线程持有的值不同)。
2、ThreadLocal 有什么作用?
主要用来实现多线程并发,一般同步和锁实现的多线程并发是通过时间换空间的形式实现,即多个线程排队等待获取使用某一种资源的权利,而ThreadLocal使用空间换时间的形式,相当于将资源拷贝为多分,每一个线程使用一份,这样多个线程就不会竞争共同的资源,也就解决了并发安全的问题。
3、ThreadLocal 实现原理?
ThreadLocal 中有一个ThreadLocalMap内部类,Thread类中也有一个ThreadLocalMap属性,实际上对ThreadLocal对象的set/get操作,都是获取当前线程ThreadLocalMap属性并对该属性进行以ThreadLocal对象为键的赋值操作。
Thread类中的ThreadLocalMap属性:
TreadLocal中的set方法,该方法实际操作的是当前线程的ThreadLocal对象:
TreadLocal中的get方法,该方法实际操作的是当前线程的ThreadLocal对象:
4、示例
ThreadLocalDemo 启动类:
package com.tspeking.thread;
public class ThreadLocalDemo {
public static void main(String[] args) {
ThreadLocalApply threadLocalApply = new ThreadLocalApply();
for (int i=0;i<3;i++) {
new Thread(new ThreadDemo(threadLocalApply)).start();
}
}
}
ThreadDemo 线程类:
package com.tspeking.thread;
public class ThreadDemo implements Runnable{
private ThreadLocalApply threadLocalApply;
public ThreadDemo (ThreadLocalApply threadLocalApply) {
this.threadLocalApply = threadLocalApply;
}
@Override
public void run() {
threadLocalApply.modifyThreadLocalData();
}
}
ThreadLocalApply ThreadLocal应用类:
package com.tspeking.thread;
import java.util.Random;
public class ThreadLocalApply {
private ThreadLocal<Integer> demo = new ThreadLocal<Integer>();
public void modifyThreadLocalData() {
Random rand = new Random();
int num = rand.nextInt(100) + 1;
System.out.println("线程:" + Thread.currentThread().getName() + " rand:" + num);
demo.set(num);
System.out.println("线程:" + Thread.currentThread().getName() + " ThreadLocal:" + demo.get());
}
}
运行结果: