博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThreadLocal
阅读量:5830 次
发布时间:2019-06-18

本文共 2498 字,大约阅读时间需要 8 分钟。

ThreadLocal 线程本地变量

用于存储和共享当前线程内的内容,而非所有线程。即相当于我们家里的东西,这东西对我们自己家人是完全共享的,谁都可以用。但是别的外人是不能够看到和使用的,但别的家庭也有自己的东西。

我们现在有个类A,在单个线程中内容保持不变,但在不同线程中内容又都不一样。这种情况我们就可以使用ThreadLocal。

如果类A被所有线程共享则导致并发问题。如果给每个调用都重新创建类A,又会导致线程内冗余,无形占用内存,增大压力。

通过以上的图可以看到,同样的调用在不同的线程中会调用到自己需要的内容。

ThreadLocal解析:

ThreadLocal<T>类有一个内部类ThreadLocalMap,ThreadLocal隶属于package java.lang, 而我们常用的Thread也隶属于package java.lang.

Thread 内部有个变量 ThreadLocal.ThreadLocalMap threadlocals= null.

ThreadLocalMap内部是一个Entry[]数组,其中key用于存储thread的实例 this,也就是 hash值,value就是我们的泛型T。

从以上可知,threadLocal这个类本身并不存储任何值,而是调用  this = Thread.currentThread();获取当前线程的实例对象。

实例对象内部有个属性 ThreadLocalMap map = this.threadlocals;即 我们的值是存储在Thread.treadlocalMap中。

ThreadLocal使用:

在connection连接池或者session中使用较多。

/** * 本地threadlocal的内容保存 * @description: * @author DennyZhao * @date: 2018年9月3日 * @version : 1.0 */public class MacThreadLocal {    /** 静态threadlocal变量 **/    private static ThreadLocal
threadlocalName = new ThreadLocal
(); private static ThreadLocal
threadlocalID = new ThreadLocal
(); private static ThreadLocal
> threadlocalMap = new ThreadLocal
>(); public void set(String key, String value){ threadlocalID.set(Thread.currentThread().getId()); threadlocalName.set(Thread.currentThread().getName()); Map
map = threadlocalMap.get(); if(map == null){ map = new HashMap
(); threadlocalMap.set(map); } map.put(key, value); } public void print(){ System.out.println("--ID---" + threadlocalID.get()); System.out.println("--NAME---" + threadlocalName.get()); for(String key: threadlocalMap.get().keySet()){ System.out.println("--Map---key:" + key + " value:" + threadlocalMap.get().get(key)); } threadlocalMap.get(); }}

main方法:

/**     * 本地线程变量测试类     * @param args     * @throws InterruptedException      */    public static void main(String[] args) throws InterruptedException {                threadLocal.set("k123", "v456");        threadLocal.print();                Thread t1 = new Thread(){            @Override            public void run() {                threadLocal.set("k567", "v890");                threadLocal.print();                super.run();            }        };        t1.start();        t1.join(100);        threadLocal.print();    }

结果:

--ID---1--NAME---main--Map---key:k123  value:v456--ID---9--NAME---Thread-0--Map---key:k567  value:v890--ID---1--NAME---main--Map---key:k123  value:v456

 

转载于:https://www.cnblogs.com/DennyZhao/p/9579773.html

你可能感兴趣的文章
从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~目录...
查看>>
被需求搞的一塌糊涂,怎么办?
查看>>
c_数据结构_队的实现
查看>>
jquery 选择器总结
查看>>
Qt设置背景图片
查看>>
【阿里云文档】常用文档整理
查看>>
java中的Volatile关键字
查看>>
前端自定义图标
查看>>
实验二
查看>>
独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!
查看>>
MyBatis使用DEMO及cache的使用心得
查看>>
网站文章如何能自动判定是抄袭?一种算法和实践架构剖析
查看>>
【OpenCV学习】滚动条
查看>>
ofo用科技引领行业进入4.0时代 用户粘性连续8个月远甩摩拜
查看>>
兰州青年志愿者“中西合璧”玩快闪 温暖旅客回家路
查看>>
计划10年建10万廉价屋 新西兰政府:比想象中难
查看>>
甘肃发首版《3D打印职业教育教材》:校企合作育专才
查看>>
李娜入选国际网球名人堂 成亚洲第一人
查看>>
为找好心人抚养孩子 浙江一离婚父亲将幼童丢弃公园
查看>>
晚婚晚育 近20年巴西35岁以上孕妇增加65%
查看>>