频道栏目
首页 > 资讯 > 其他 > 正文

正确理解ThreadLocal

17-12-23        来源:[db:作者]  
收藏   我要投稿

一开始看了一篇文章,发现确实是写错了。

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对象。我们在使用get方法的时候,实际上就是先获取了自己这个线程的map(相当于这个线程自己家的藏宝库),第二步看看上面,传的是sThreadLocal本身。以他自身为键,取得某个变量。所以说你这个get方法,其实是1对1的!别看有这么多的map什么的。效果等同于

Looper looper = new Looper();

乖乖!为什么要绕这么大一个弯子!优点就是保证了这个变量的线程安全啊!仔细回想下,我们是通过我们的线程去取的。所以说每个线程都会维护一个独一无二的Looper。就算有100万个线程同时操纵Looper类的这个变量,也不会有任何问题啊!

相关TAG标签
上一篇:Servlet&JSP前端代码报错:Failedtodecodedownloadedfont问题解决
下一篇:Android 普通View截图 RecyclerView截图 ScrollView截图分享
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站