JDKAPI 解释:
该类提供了线程局部 (thread-local) 变量。这些变量不一样于它们的普通对应物,由于访问某个变量(经过其get或set方法)的每一个线程都有本身的局部变量,它独立于
初始化变量的副本。ThreadLocal实例一般是类中的 private static 字段,它们但愿将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
资料查找总结:
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类能够很简洁地编写出优美的多线程程序。
我的认为ThreadLocal 就是一种Map key-value 的实现思路。当使用ThreadLocal维护变量时,ThreadLocal为每一个使用该变量的线程提供独立的变量副本 。将每一个线程做为key ,线程操做的数据做为value。每一个线程能够独立修改本身的value ,而不影响其余线程对应的value。
ThreadLocal方法详细信息 :
initialValue
protected T initialValue()返回此线程局部变量的当前线程的“初始值”。线程第一次使用 get() 方法访问变量时将调用此方法,但若是线程以前调用了 set(T) 方法,则不会对该线程再调用 initialValue 方法。一般,此方法对每一个线程最多调用一次,但若是在调用 get() 后又调用了 remove(),则可能再次调用此方法。
该实现返回 null;若是程序员但愿线程局部变量具备 null 之外的值,则必须为 ThreadLocal 建立子类,并重写此方法。一般将使用匿名内部类完成此操做。
返回:
返回此线程局部变量的初始值
get
public T get()返回此线程局部变量的当前线程副本中的值。若是变量没有用于当前线程的值,则先将其初始化为调用 initialValue() 方法返回的值。
返回:
此线程局部变量的当前线程的值
set
public void set(T value)将此线程局部变量的当前线程副本中的值设置为指定值。大部分子类不须要重写此方法,它们只依靠 initialValue() 方法来设置线程局部变量的值。
参数:
value - 存储在此线程局部变量的当前线程副本中的值。
remove
public void remove()移除此线程局部变量当前线程的值。若是此线程局部变量随后被当前线程读取,且这期间当前线程没有设置其值,则将调用其 initialValue() 方法从新初始化其值。这将致使在当前线程屡次调用 initialValue 方法
threadLocal和Synchonized都用于解决多线程并发访问。可是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每个线程都提供了变量的副本,使得每一个线程在某一时间访问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通讯时可以得到数据共享。
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
固然ThreadLocal并不能替代synchronized,它们处理不一样的问题域。Synchronized用于实现同步机制,比ThreadLocal更加复杂。 程序员