ThreadLocal 为了编写更优雅的多线程程序
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLoacl 不是一个线程,而是Thread的一个局部变量
从线程的角度看,目标变量就像是线程的本地变量
使用
接口方法
/**
* 设置当前线程的线程局部变量的值
*/
void set(Object value)
/**
* 该方法返回当前线程所对应的线程局部变量。
*/
public Object get()
/**
* 将当前线程局部变量的值删除,目的是为了减少内存的占用,
* 该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,
* 对应该线程的局部变量将自动被垃圾回收,
* 所以显式调用该方法清除线程的局部变量并不是必须//的操作,
* 但它可以加快内存回收的速度。
*/
public void remove()
/**
* 返回该线程局部变量的初始值,该方法是一个protected的方法,
* 显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,
* 在线程第1次调用get()或set(Object)时才执行,
* 并且仅执行1次。ThreadLocal中的缺省//实现直接返回一个null
*/
protected Object initialValue()
使用场景
数据库连接:在多线程中,如果使用懒汉式的单例模式创建Connection对象,由于该对象是共享的,那么必须要使用同步方法保证线程安全,这样当一个线程在连接数据库时,那么另外一个线程只能等待。这样就造成性能降低。如果改为哪里要连接数据库就来进行连接,那么就会频繁的对数据库进行连接,性能还是不高。这时使用ThreadLocal就可以既可以保证线程安全又可以让性能不会太低。但是ThreadLocal的缺点时占用了较多的空间。
网友评论