java-ThreadLocal简介
android中的Looper类,使用了ThreadLocal保存每个线程的Looper
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
简单了解下ThreadLocal的概念和使用。
(一)概念
ThreadLocal为每个线程提供变量的副本,该变量线程间独立不影响。
(二)使用
/** * ThreadLocal用法测试 * * @author peter_wang * @create-time 2014-12-24 下午8:15:47 */ public class ThreadLocalDemo { private static ThreadLocal<Integer> num = new ThreadLocal<Integer>(){ //提供初始化,不实现初始化方法首次使用get()的时候也需要初始化对象 protected Integer initialValue() { return 0; }; }; private static class ThreadLocalThread extends Thread { @Override public void run() { for (int i = 0; i < 3; i++) { num.set(num.get() + 1); System.out.println("Thread name is " + getName() + ",num is " + num.get()); } } } /** * @param args */ public static void main(String[] args) { ThreadLocalThread thread1 = new ThreadLocalThread(); thread1.start(); ThreadLocalThread thread2 = new ThreadLocalThread(); thread2.start(); } }
运行结果:
Thread name is Thread-0,num is 1
Thread name is Thread-1,num is 1
Thread name is Thread-1,num is 2
Thread name is Thread-1,num is 3
Thread name is Thread-0,num is 2
Thread name is Thread-0,num is 3
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。ThreadLocal提供变量拷贝,线程间独立,访问效率高,用“空间换时间”;线程同步机制对变量进行线程间访问互斥锁,变量多线程共享,访问效率低,处理负责,用“时间换空间”。
ThreadLocal不是用来解决变量线程共享安全的,而是提供了保存对象的方法。
(四)源码分析
查看源码,每个Thread中都带有ThreadLocal.ThreadLocalMap变量
在ThreadLocal中将变量和Thread通过map绑定
public void set(T value) { Thread t = Thread.currentThread(); //获取ThreadLocalMap绑定该线程和对象变量 ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。