什么是ThreadLocal
java
该类提供了线程局部变量,就是为每个使用它的线程提供一个变量的副本,使每个
api
线程能够独立的改变本身的副本,而不会和其它线程发生冲突。说白了就是解决对线程访问共享安全
资源时发生冲突的问题,也算是一种同步的方式。
多线程
ThreadLocal的实现原理
ide
public class ThreadLocal { private Map values = Collections.synchronizedMap(new HashMap()); public Object get() { Thread curThread = Thread.currentThread(); Object o = values.get(curThread); if (o == null && !values.containsKey(curThread)) { o = initialValue(); values.put(curThread, o); } return o; } public void set(Object newValue) { values.put(Thread.currentThread(), newValue); } public Object initialValue() { return null; } }
思路就是他的底层维护了一个线程安全的Map,Map就以键值对的形式存储线程对象和线程对象的副本值。
线程
ThreadLocal的经常使用api3d
其中initialValue()方法用于返回此线程局部变量的当前线程的初始值,该方法是一个延迟调用的方法,只有当线程第一次调用get或者set对象
方法时,他才会执行,而且只执行这一次。还有他是一个protected修饰的方法,能够方便子类重写该方法,能够根据需求进行自定义的初始化。blog
ThreadLocal与其余同步机制的区别资源
ThreadLocal与普通的同步机制都是为了解决多线程访问共享资源时会产生冲突的问题,普通的同步机制是控制了线程对共享资源的
访问时间而避免冲突的,他是多个线程进行通讯的有效方式,而ThreadLocal则是在空间上对共享数据进行了隔离,从根本上来讲,数据已经
不在共享了以此避免冲突。所以两种方式是在不一样的角度所实现的线程安全。
当咱们须要多线程之间进行通讯就使用同步机制,须要隔离多个线程之间的共相冲突,就是用ThreadLocal。