从字面上看它好像是一个本地线程,但其实它不是一个线层,而是当前线层Thread的局部变量。
使用场景:在Java的多线程编程中,为保证多个线程对共享变量的安全访问,通常会使用synchronized来保证同一时刻只有一个线程对共享变量进行操作。这种情况下可以将类变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。
ThreadLocal类接口很简单,只有4个方法,我们先来了解一下:
void get()
void set(Object value)
public void remove()
protected Object initialValue()
它只有这四个方法
get(),set(),无非就是给当前线程取得当前线程的局部变量和设置当前线程的局部变量, remove()是清楚这个线程的局部变量,其实可以不用清楚,当该线程的生命周期结束时,此变量的内存会被自动回收,加了是便于快速回收节约内存。
来看下ThreadLocal源码
public class ThreadLocal
public
class
ConnectionUtil {
private
static
ThreadLocal tl =
new
ThreadLocal();
private
static
Connection initConn =
null
;
static
{
try
{
initConn = DriverManager.getConnection(
"url, name and password"
);
}
catch
(SQLException e) {
e.printStackTrace();
}
}
public
Connection getConn() {
Connection c = tl.get();
tl.set(initConn);
return
c;
}
}