ThreadLocal
来源:互联网 发布:java 类的定义 编辑:程序博客网 时间:2024/05/22 11:40
threadlocal是线程本地变量,用法:
ThreadLocal<String> stringLocal = new ThreadLocal();stringLocal.set("hello"); //设置值stringLocal.get(); //获取值stringLocal.remove(); //删除简单理解,每个threadlocal都有一个Map(这个map其实是当前线程的成员变量threadLocals),key为当前变量threadlocal,value为设置的值。示例:
public static void main(String[] args) throws Exception{ final ThreadLocal<String> strLocal = new ThreadLocal<String>(); strLocal.set("hello"); System.out.println(strLocal.get()); Thread thread = new Thread(){ public void run(){ strLocal.set("world"); //在下一行断点,发现thread的threadlocals的size为1,key为strLocal,值为"world" System.out.println("thread:" + strLocal.get()); } }; thread.start(); thread.join(); Thread current = Thread.currentThread(); //在下一行断点,发现current的threadlocals的size为1,key为strLocal,值为"world" System.out.println(strLocal.get()); }
当strLocal调用set时,获取当前线程的成员变量threadlocals,存入一对键值对,key为strLocal,value为set的值。虽然是strLocal调用set方法,但strLocal自己并没有一个map对象,我们断点发现,它只有一个变量threadLocalHashCode,用于在map中查找时使用。
看了很多博客,说threadlocals自己有一个map为每一个线程保存一个副本,实际并非如此,副本实际上保存在线程自己的成员变量中,而threadlocal只是提供了一个get的条件而已:当前线程已知(可以获取存线程本地变量的map),要获取的threadlocal变量(map中的key),然后内部调用map.get(key)就取到本地副本了。
延伸:关于ThreadLocal可能产生内存泄漏
0 0
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- threadlocal
- ThreadLocal
- ThreadLocal
- 文章标题
- [Perl]向syslog写入自定义日志(Sys::Syslog)
- 大风过岗,浮草唯存
- android相关的系列文章
- 194. Transpose File leetcode Bash
- ThreadLocal
- 继承设计技巧
- 利用反射拿到泛型的类型
- Relativelayout
- 《swift2.0 官方教程中文版》 第2章-25高级运算符
- 紫金桥软件与国内外主流硬盘录像机通讯详解
- git gitignore
- 词干提取和词形还原
- JavaScript 高级程序设计——第三章基本概念 学习笔记