ThreadLocal表示线程的局部变量,线程私有的。它采用采用空间来换取时间的方式,解决多线程中相同变量的访问冲突问题。
public class Number { //每个线程都私有该变量 ThreadLocal<Integer> t = new ThreadLocal<Integer>() { protected Integer initialValue() { return 100; } }; public int get() { return t.get(); } public void set() { t.set(t.get() + 10); } //若有其他变量,为多个线程共享一个变量 }
public class Transfer implements Runnable{ Number number; public Transfer(Number bank){ this.number = bank; } @Override public void run() { for (int i = 0;i<10;i++){ number.set(); System.out.println(Thread.currentThread() + " " + number.get()); } } }
测试类:
public class Test { public static void main(String[] args) throws InterruptedException { Number bank = new Number(); Transfer t = new Transfer(bank); Thread t1 = new Thread(t); t1.start(); Thread t2 = new Thread(t); t2.start(); t1.join(); t2.join(); System.out.println(bank.get()); } }
运行结果:
Thread[Thread-0,5,main] 110
Thread[Thread-0,5,main] 120
Thread[Thread-0,5,main] 130
Thread[Thread-0,5,main] 140
Thread[Thread-0,5,main] 150
Thread[Thread-1,5,main] 110
Thread[Thread-1,5,main] 120
Thread[Thread-1,5,main] 130
Thread[Thread-1,5,main] 140
Thread[Thread-1,5,main] 150
100
从以上结果可以看出每个线程都操作自己的私有变量,互不影响。