1.什么是ThreadLocal
ThreadLocal一般称为线程本地变量,是一个特殊的线程绑定机制,将线程和变量绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内,而不会和其他线程的副本冲突。
2.ThreadLocal是如何做到为每一个线程维护一个变量副本的呢?
在ThreadLocal类中定义一个ThreadLocalMap,每一个Thread中都有一个该类型的变量----threadlocals----用于存储每一个线程的变量副本。可以通过看源码会了解的更清楚。
3.为什么使用ThreadLocal?
编写一个多线程安全的程序,使线程共享资源,共享资源需要进行同步(synchronized),同步会带来一些问题,如:会造成延时,影响性能;在线程同步时,要处理好对象的锁定与释放,避免产生死锁。
既然共享资源那么困难,那么干脆不要共享,直接为每个线程创建一个资源的副本。将每一个线程存取数据的行为加以隔离,实现的方法就是给予每个线程一个特定的空间来保管该线程所独享的资源。而ThreadLocal可以做到这一点。
4、ThreadLocal的用法,主要用到四个方法。
ThreadLocal tLocal = new ThreadLocal();
tLocal.get() =>获取ThreadLocal中当前线程共享变量的值。
tLocal.set() =>设置ThreadLocal中当前线程共享变量的值。
tLocal.remove()=>移除ThreadLocal中当前线程共享变量的值。
tLocal.initialValue()==>ThreadLocal没有被当前线程赋值或调用remove方法后调用get方法,则返回此方法值。
5.实现
输出结果为:线程A: 0
线程A: 1
线程A: 2
线程A: 3
使用ThreadLocal的remove方法后, 在调用get方法,返回当前线程变量的值是: null
线程A: 0
也就是说把一个线程放入ThreadLocal后只要还在是本线程的话可以在任意时候调用都可以获得这个对象,避免了一些繁琐的传参操作,也让需要传数据更加的安全。