多线程间共享变量线程安全问题——ThreadLocal Java并发编程中很重要的类:ThreadLocal在多线程应用程序中,对共享变量进行读写的场景是很常见的。如果不使用一定的技术或方案,会引发各种线程安全的问题。常见解决线程安全的方式有synchronized、volatile等方式,但synchronized对性能的开销大,volatile不能保证原子性,所以这里介绍一个解决多线程间共享变量的线程安全问题的方法——ThreadLocal1.什么是 ThreadLocalThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.ThreadLocal 可以给当前线程关联一个数据(普通变量、 对象、 数组)set 方法 [源码!]ThreadLocal 可以像 Map 一样存取数据, key 为当前线程, get 方法每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数 据, 就需要使用多个 ThreadLocal对象实例每个 ThreadLocal 对象实例定义的时候, 一般为 static 类型ThreadLocal 中保存数据, 在线程销毁后, 会自动释放threadlocal时序图:2、ThreadLocal的作用多线程访问同一个共享变量时特别容易出现并发问题,特别是在多个线程需要对共享变量进行写入时。为了保证线程安全,一般使用者在访问共享变量时需要进行适当的同步,如图 1-3 所示同步的措施一般是加锁,但加锁会在一定程度上增加系统的复杂度以及影响系统的性能。为了解决多线程间共享变量的线程安全,ThreadLocal应运而生。当创建一个ThreadLocal变量时,访问这个变量的每个线程都有这个变量的一个本地副本,当多个线程操作这个变量时,实际上就是操作自己本地内存里面的变量,从而避免了线程安全问题。图 1-3 就变成了 图1-4 如图:3,、Threadlocal的使用示例public class ThreadLocalTest { private static ThreadLocalString threadLocal = new ThreadLocal(); public static void main(String[] args) { Thread thread1 = new Thread(() - { threadLocal.set("threadLocal变量1"); print("thread1"); System.out.println("线程1的threadLocal变量的值为:"+threadLocal.get()); }); Thread thread2 = new Thread(() - { threadLocal.set("threadLocal变量2"); print("thread2"); System.out.println("线程2的threadLocal变量的值为:"+threadLocal.get()); }); thread1.start(); thread2.start(); } public static void print(String s){ System.out.println(s+":"+threadLocal.get()); } }上述代码中,有一个 threadLocal 变量,