• ThreadLocal在子线程中的访问


    当一个线程T定义一个ThreadLocal局部变量,在线程T下再创建一个子线程T1,那么T1访问不到ThreadLocal

    ThreadLocal使用的是Map,每个线程中有一个Map结构,初始化Map并和此线程绑定

    public class A{
    
    	static int a = 5;
    	
    	public static void main(String[] args) {
    		
    		int b = 7;
    		
    		new Thread(new Runnable() {
    			
    			ThreadLocal<String> thread = new ThreadLocal<String>();
    			
    			@Override
    			public void run() {
    				thread.set("hello");
    				
    				new Thread(new Runnable() {
    					
    					@Override
    					public void run() {
    						System.out.println(String.format("inner thread :)%s", thread.get()));
    						System.out.println(String.format("inner a :)%s", a));
    						System.out.println(String.format("inner b :)%s", b));
    					}
    				}).start();
    				
    				System.out.println(String.format("outer thread :)%s", thread.get()));
    				System.out.println(String.format("outer a :)%s", a));
    				System.out.println(String.format("outer b :)%s", b));
    				
    				while(true) {
    					try {
    						Thread.sleep(500);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		}).start();
    	}
    
    }
    

    输出结果为:

    inner thread :)null
    inner a :)5
    inner b :)7
    outer thread :)hello
    outer a :)5
    outer b :)7
    

    说明子线程访问不到父线程的局部变量ThreadLocal

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
    
    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
    
    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }
    

    每个线程都有与之对应的Map,,每次new一个ThreadLocal,都会在与之对应的Map中添加一条记录

    map.set(this, value);

    其中的key为当前new ThreadLocal()对象本身变量,value为当前ThreadLocal设置的值

    一个线程可以创建多个局部变量,那么Map中就可能存储多条ThreadLocal

  • 相关阅读:
    asp.net core 中TagHelper使用
    vs2015 添加命令提示工具
    关于MVC中Start.cs文件的作用
    Sql Server的两个小技巧
    用vue.js重构订单计算页面
    用vue.js实现购物车功能
    一步步实现自己的ORM(五)
    一步步实现自己的ORM(四)
    将Object转换成Dictionary方法
    一步步实现自己的ORM(三)
  • 原文地址:https://www.cnblogs.com/zj68/p/14694354.html
Copyright © 2020-2023  润新知