java ThreadLocal

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更加复杂。  程序员

 
相关文章
相关标签/搜索