ThreadLocal
ThreadLocal的基本含义
ThreadLocal代表线程局部变量,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程副本冲突。
它可以看做是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定到这个线程上的一个值。
下面是它的用法示例:
class Account {
private ThreadLocal<String> name = new ThreadLocal<>();
public Account(String string) {
this.name.set(string);
}
public String getName() {
return name.get();
}
public void setName(String string) {
name.set(string);
}
}
class MyTest extends Thread {
private Account account;
public MyTest(Account account, String name) {
super(name);
this.account = account;
}
public void run() {
for (int i=0;i<5;i++) {
if (i == 2) {
account.setName(getName());
}
System.out.println(account.getName() + "账户的i的值:" + i);
}
}
}
public class ThreadLocalTest {
public static void main(String[] args) {
Account at = new Account("线程Main");
//main线程中thradlocal中的变量值
System.out.println(at.getName());
new MyTest(at, "线程甲").start();
new MyTest(at, "线程乙").start();
}
}
运行结果如下:
线程Main
null账户的i的值:0
null账户的i的值:1
线程甲账户的i的值:2
线程甲账户的i的值:3
线程甲账户的i的值:4
null账户的i的值:0
null账户的i的值:1
线程乙账户的i的值:2
线程乙账户的i的值:3
线程乙账户的i的值:4
上面程序中变量的关系如下:
下面是一个使用ThreadLocal来实现计时功能的类:
public class Profiler {
private static final ThreadLocal<Long> TIME_THREADLOCAL = new ThreadLocal<Long>(){
@Override
protected Long initialValue() {
return System.currentTimeMillis();
}
};
public static final void begin() {
TIME_THREADLOCAL.set(System.currentTimeMillis());
}
public static final long end() {
return System.currentTimeMillis() - TIME_THREADLOCAL.get();
}
public static void main(String[] args) throws Exception{
Profiler.begin();
TimeUnit.SECONDS.sleep(1);
System.out.println("Cost: " + Profiler.end() + " mills");
}
}
输出:
Cost: 1009 mills