您的位置:首页 > 其它

ThreadLocal 的理解

2018-02-22 10:07 513 查看
http://blog.csdn.net/qq_36523667/article/details/78877176

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类的这个变量,也不会有任何问题啊!

以上是转载

其实就是复制了原来的变量在每个线程里操作自己的,互不影响
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: