ThreadLocal 的理解
2018-02-22 10:07
513 查看
http://blog.csdn.net/qq_36523667/article/details/78877176
ThreadLocal的get方法
他是先获取当前的线程,再以当前线程为键,从map中取得ThreadLocalMap,又一个map!再以当前的ThreadLocal为键,获取值。所以我们每个线程都维护着一个map,所以这个map实际上就是每个线程各自存放的各个变量的地方。
举个例子来梳理下流程
Looper的源码
比如说你在一个线程中调用了mLooper.prepare()
这个sThreadLocal是线程类中维护的ThreadLocal<Looper>对象。我们在使用get方法的时候,实际上就是先获取了自己这个线程的map(相当于这个线程自己家的藏宝库),第二步看看上面,传的是sThreadLocal本身。以他自身为键,取得某个变量。所以说你这个get方法,其实是1对1的!别看有这么多的map什么的。效果等同于
Looper looper = new Looper();
乖乖!为什么要绕这么大一个弯子!优点就是保证了这个变量的线程安全啊!仔细回想下,我们是通过我们的线程去取的。所以说每个线程都会维护一个独一无二的Looper。就算有100万个线程同时操纵Looper类的这个变量,也不会有任何问题啊!
以上是转载
其实就是复制了原来的变量在每个线程里操作自己的,互不影响
ThreadLocal的get方法
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }
他是先获取当前的线程,再以当前线程为键,从map中取得ThreadLocalMap,又一个map!再以当前的ThreadLocal为键,获取值。所以我们每个线程都维护着一个map,所以这个map实际上就是每个线程各自存放的各个变量的地方。
举个例子来梳理下流程
Looper的源码
比如说你在一个线程中调用了mLooper.prepare()
private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed)); }
这个sThreadLocal是线程类中维护的ThreadLocal<Looper>对象。我们在使用get方法的时候,实际上就是先获取了自己这个线程的map(相当于这个线程自己家的藏宝库),第二步看看上面,传的是sThreadLocal本身。以他自身为键,取得某个变量。所以说你这个get方法,其实是1对1的!别看有这么多的map什么的。效果等同于
Looper looper = new Looper();
乖乖!为什么要绕这么大一个弯子!优点就是保证了这个变量的线程安全啊!仔细回想下,我们是通过我们的线程去取的。所以说每个线程都会维护一个独一无二的Looper。就算有100万个线程同时操纵Looper类的这个变量,也不会有任何问题啊!
以上是转载
其实就是复制了原来的变量在每个线程里操作自己的,互不影响
相关文章推荐
- 理解java.lang.ThreadLocal 类
- 彻底理解ThreadLocal
- 简单理解ThreadLocal原理和适用场景,多数据源下ThreadLocal的应用
- 理解ThreadLocal
- 正确理解ThreadLocal
- 转:理解ThreadLocal
- 深入理解ThreadLocal工作原理及使用示例
- 正确理解ThreadLocal
- ThreadLocal用法理解
- 理解ThreadLocal
- 彻底理解ThreadLocal
- 正确理解ThreadLocal
- 理解ThreadLocal .
- 彻底理解ThreadLocal
- 彻底理解ThreadLocal
- 理解ThreadLocal
- 彻底理解ThreadLocal
- ThreadLocal理解和运用
- 深入理解线程本地变量ThreadLocal
- 彻底理解ThreadLocal