• java多线程系列17 ThreadLocal


    ThreadLocal 叫做 线程局部变量

    在详细解释之前 先看一段代码

    public class ThreadLocalTest {
    
    	private static ThreadLocal<Integer> intThreadLocal = new ThreadLocal<Integer>();
    
    	public static void main(String[] args) {
    		for (int i = 0; i < 2; i++) {
    			new Thread(new Runnable() {
    				@Override
    				public void run() {
    					int data = new Random().nextInt(10000);
    					System.out.println(Thread.currentThread().getName() + " add data :" + data);
    					intThreadLocal.set(data);
    					System.out.println(Thread.currentThread().getName() + " " + intThreadLocal.get());
    				}
    			}).start();
    		}
    	}
    

      运行结果如下

         

    可以看到每个Thread都是自己设置进去的那个值,相互不影响

     

    ThreadLocal有两个比较重要的方法

    get() set()

    下面我们细看一下 get()

    public T get() {
          //获取当前线程
            Thread t = Thread.currentThread();
          //获取到当前线程的ThreadLocalMap对象,每个线程都有一个
            ThreadLocalMap map = getMap(t);
            if (map != null) {  //不为空 就把ThreadLocal作为key 获取对应的值
                ThreadLocalMap.Entry e = map.getEntry(this);
                if (e != null) {
                    @SuppressWarnings("unchecked")
                    T result = (T)e.value;
                    return result;
                }
            }
            return setInitialValue(); //为空 就初始化
        }
    

      

     下面我们细看一下 set()

      

    //map不为空 将值设置进线程的 ThreadLocal中。为空就new一个
      public void set(T value) {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null)
                map.set(this, value);
            else
                createMap(t, value);
        }
    

      

     总结:

    1 ThreadLocal 不是用来解决共享对象的多线程访问问题的,

    一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象(新new出来的对象),其他线程是不需要访问的,也访问不到的。

    倘若都设置的同一个对象 依然会有线程安全问题。

    2  若多个线程之间需要共享资源,以达到线程间的通信时,就使用同步机制;若仅仅需要隔离多线程之间的关系资源,则可以使用ThreadLocal

  • 相关阅读:
    PhpStorm 全文搜索快捷键(ctrl+shift+f)被占用 的解决办法
    IDEA phpstorm插件CamelCase 【大小写,下划线,驼峰,首字母大写等转化工具】
    php foreach中&注意事项
    PHP7 ?:和??的区别
    PHP中类似$a && $b = $c 语法的用法和实例
    docker 运行dnmp 的php项目 『cURL』curl: (6) Could not resolve host 问题解决方案
    Redis规范整理
    Windows 10桌面美化-任务栏透明StartlsBack工具
    docker容器封装redis 挖矿病毒kdevtmpfs的处理
    ubuntu安装 docker-compose
  • 原文地址:https://www.cnblogs.com/javabigdata/p/7061069.html
Copyright © 2020-2023  润新知