理解Threadlocal
2017-11-27 18:40
330 查看
ThreadLocal 简介
简单说,threadlocal的作用就是保证你在调用get的时候获取的值,是在同一个线程中,你之前set过的值。private static final ThreadLocal<String> tlocal=new ThreadLocal(); /*假设有两个线程都执行完1,并且没有执行2.后面不管哪个线程先执行2,取出来的值都是自己之前set的值*/ void foo(){ tlocal.set(UUID.toString());//1 tlocal.get();//2 }
或者说,threadlocal就是往线程中set一个值,在这个线程的生命周期中,不需要显示传递,都可以获取到这个值
ThreadLocal 原理
下面看下Threadlocal部分源码java.lang.ThreadLocal public class ThreadLocal<T> { .... public void set(T value) { Thread t = Thread.currentThread();//获取当前线程 ThreadLocalMap map = getMap(t);//通过当前线程获取了一个ThreadLocalMap if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals;//java.lang.Thread 有个ThreadLocalMap 的成员变量 /*ThreadLocalMap是一个通过开放寻址实现的,key类型为ThreadLocal的Map,其中Entry为弱引用*/ static class ThreadLocalMap { static class Entry extends WeakReference<ThreadLocal> { Object value; Entry(ThreadLocal k, Object v) { super(k); value = v; } } private static final int INITIAL_CAPACITY = 16; private Entry[] table; ... } }
说白了就是这样
通过Thread.currentThread()可以获取代表当前线程的线程实例
每个thread对象(或者说每个线程)都有个key类型为Threadlocal的 Map,Map的value就是我们存的值
如果我们要往thread(线程)的map put值或get值,必须通过ThreadLocal 来访问这个对象
1和2 ,感觉就像这样
private static final ThreadLocal<String> tlocal=new ThreadLocal(); void foo(){ Thread.currentThread().put(tlocal,UUID.toString()); Thread.currentThread().get(tlocal); }
感觉说的不是很清楚。。。。。
相关文章推荐
- 理解ThreadLocal
- 理解ThreadLocal
- Java学习整理系列之ThreadLocal的理解
- ThreadLocal模式的一点小理解
- 理解ThreadLocal
- Java并发编程--理解ThreadLocal
- 彻底理解ThreadLocal
- 彻底理解ThreadLocal
- 理解ThreadLocal
- Java学习札记17:理解 ThreadLocal
- 深入理解ThreadLocal
- ThreadLocal的理解
- 理解数据库连接池和ThreadLocal实现的事务控制
- 理解ThreadLocal
- ThreadLocal深入理解
- 理解ThreadLocal(之一)
- 自己对ThreadLocal的理解(作为讨论)
- 彻底理解ThreadLocal
- 深入理解ThreadLocal
- 彻底理解ThreadLocal