Handler是android开发中必须学而且非常重要的知识点,handler主要来处理异步通讯,而这里就会涉及到多线程异步通讯,在了解Handler前先来说一下ThreadLocal
先来创建一个ThreadLocal,根据代码来了解其存储原理:
TheadLocal<String> local = new ThreadLocal();
local.set("hello"); // 设置value
local.get();// 获取value
- 创建一个String泛型的Threadlocal对象
- 存储一个String的value到local中,而这一步内部实现为:
public void set(T value) {
Thread t = Thread.currentThread(); //获取当前线程
ThreadLocalMap map = getMap(t);// 注释1
if (map != null)
map.set(this, value); // 注释2
else
createMap(t, value); // 注释3
}
注释1:根据当前Thread对象获取该Thread对象的成员变量,ThreadLocal.ThreadLocalMap ,默认为null;ThreadLocalMap是ThreadLocal的静态内部类是一个类似Map的数据结构key为该Threadlocal对象,value是需要存储的值;
注释2:将key为threadlocal对象value存储到Threadlocalmap而这个map的引用存在于Thread类
注释3:如果Thread类中该map还未存储过数据,创建一个ThreadLocalMap指向Thread中的map,然后将值存进去,源码如下:
/**
* Create the map associated with a ThreadLocal. Overridden in
* InheritableThreadLocal.
*
* @param t the current thread
* @param firstValue value for the initial entry of the map
*/
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
- 获取ThreadLocal的值,其实就是先获取当前Thread的成员变量ThreadLocalMap中key为当前ThreadLocal对象所对应的value
ThreadLocal与其他同步机制的区别
ThreadLocal与普通的同步机制都是为了解决多线程访问共享资源时会产生冲突的问题,普通的同步机制是控制了线程对共享资源的访问时间而避免冲突的,他是多个线程进行通信的有效方式,而ThreadLocal则是在空间上对共享数据进行了隔离,从根本上来说,数据已经不在共享了以此避免冲突。因此两种方式是在不同的角度所实现的线程安全。当我们需要多线程之间进行通信就使用同步机制,需要隔离多个线程之间的共相冲突,就是用ThreadLocal。
总结
ThreadLocal就是了一个类似Map的数据结构key是当前ThreadLocal,value是需要存储值,当set或者init的时候,实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的;
网友评论