ThreadLocal是java里面的特殊变量
他是一个线程级别的变量,每个线程都有一个threadlocal就是每个线程都有自己的独立的一个变量
竞争状态下被彻底消除了,在并发模式下是绝对安全的变量
用法:Thread Local<T> var =new THreadLocal<T>();
会自动在那个线程中创建一个T的副本副本之间彼此独立不会影响
可以使用ThreadLocal存储一些参数,一边线程中多个方法使用,用来替代方法传参的做法
实现原理,jvm维护了一个map<Thread ,T> 每个线程去Map里面去,
看代码案例:
/** 线程封闭示例 */ public class Demo7 { /** threadLocal变量,每个线程都有一个副本,互不干扰 */ public static ThreadLocal<String> value = new ThreadLocal<>(); /** * threadlocal测试 * * @throws Exception */ public void threadLocalTest() throws Exception { // threadlocal线程封闭示例 value.set("这是主线程设置的123"); // 主线程设置值 String v = value.get(); System.out.println("线程1执行之前,主线程取到的值:" + v); new Thread(new Runnable() { @Override public void run() { String v = value.get(); System.out.println("线程1取到的值:" + v); // 设置 threadLocal value.set("这是线程1设置的456"); v = value.get(); System.out.println("重新设置之后,线程1取到的值:" + v); System.out.println("线程1执行结束"); } }).start(); Thread.sleep(5000L); // 等待所有线程执行结束 v = value.get(); System.out.println("线程1执行之后,主线程取到的值:" + v); } public static void main(String[] args) throws Exception { new Demo7().threadLocalTest(); } }
栈封闭: 局部变量
局部变量就是线程封闭中,其他线程无法访问