* 既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题。
*
* ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。ThreadLocal 变量通常被private static修饰。
* 当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。
*
* 总的来说,ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景
*
* ThreadLocal与synchronized有本质的区别:
* 1、Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
* 2、Synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本
* ,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。
* 而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。
*
* 一句话理解ThreadLocal是作为当前线程中属性ThreadLocalMap集合中的某一个Entry的key值Entry(threadlocl,value),
* 虽然不同的线程之间threadlocal这个key值是一样,但是不同的线程所拥有的ThreadLocalMap是独一无二的,
* 也就是不同的线程间同一个ThreadLocal(key)对应存储的值(value)不一样,从而到达了线程间变量隔离的目的,
* 但是在同一个线程中这个value变量地址是一样的。
*
*/
public class ThreadLocaDemo {
private static ThreadLocal localVar = new ThreadLocal();
static void print(String str) {
//打印当前线程中本地内存中本地变量的值
//清除本地内存中的本地变量
localVar.remove();
}
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
public void run() {
ThreadLocaDemo.localVar.set("local_A");
print("A");
//打印本地变量
}
},"A").start();
Thread.sleep(1000);
new Thread(new Runnable() {
public void run() {
ThreadLocaDemo.localVar.set("local_B");
print("B");
}
},"B").start();
}
}
领取专属 10元无门槛券
私享最新 技术干货