ThreadLocal源码理解
来源:互联网 发布:比较好的java开源项目 编辑:程序博客网 时间:2024/06/10 13:31
ThreadLocal其实原理是创建了多份相同数据保存在堆内存上,每个线程的Thread类里有ThreadLocal.ThreadLocalMap threadLocals的属性来指向存位置,
所以每个线程修改都不会影响到其他线程的数据
首先说下下面用到的东西:ThreadLocalMap为ThreadLocal的静态内部类,他有Entry[]数组来存放本地变量
static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }
ThreadLocal get方法源码 它会调用getMap(t)方法,这个getMap()方法会返回当前线程的ThreadLocalMap的实例,通过ThreadLocalMap的getEntry()方法
根据当前ThreadLoad获取到Entry后取得值。如果当前线程没有ThreadLocalMap的引用,则初始化一分数据并将引用传给当前线程。
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(); }
ThreadLocalMap getMap(Thread t) { return t.threadLocals; }private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; }
ThreadLocal set方法也是通过getMap方法获取到当前线程对应的ThreadLocalMap后设置值,如果map为空则先为线程创建ThreadLocalMap并将值放入以当前
ThreadLocal为Entry的K
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); }
阅读全文
0 0
- ThreadLocal源码理解
- ThreadLocal源码理解
- ThreadLocal源码的一些理解
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解Threadlocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- 理解ThreadLocal
- JqGrid 中 navGridd方法使用方法
- STM32 BOOT0连接不当造成死机
- aosp android 项目结构
- 关于获取屏幕分辨率和物理尺寸等个人小记
- 土地切出最大方块
- ThreadLocal源码理解
- 下拉菜单的出现的左对齐怎么实现
- 点点滴滴
- css四种引入方式
- node.js操作MySQL
- 数据结构---树
- SQL的常用数据类型
- 判断当前cpu 使用的page是否属于numa 远端内存
- 延迟加载