ThreadLocal表明线程局部变量,就是为每个使用该变量的线程都提供一个变量值的副本,使每个线程均可以独立地改变本身的副本,而不会和其它线程副本冲突。java
它能够看作是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程能够根据一个ThreadLocal对象查询到绑定到这个线程上的一个值。
下面是它的用法示例:ide
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(); } }
运行结果以下:this
线程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来实现计时功能的类:code
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