ThreadLocal,叫做线程本地存储,也可以叫做线程本地变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
一、如何使用
class Accessor implements Runnable {
private final int id;
public Accessor(int id) {
this.id = id;
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
ThreadLocalVariableHolder.increment();
System.out.println(this);
Thread.yield();
}
}
public String toString() {
return "#" + id + ":" + ThreadLocalVariableHolder.get();
}
}
public class ThreadLocalVariableHolder {
private static ThreadLocal<Integer> value = new ThreadLocal<Integer>() {
protected synchronized Integer initialValue() {
return 10000;
}
};
public static void increment() {
value.set(value.get() + 1);
}
public static int get() {
return value.get();
}
public static void main(String[] args) throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 3; i++) {
exec.execute(new Accessor(i));
}
TimeUnit.SECONDS.sleep(1);
exec.shutdownNow();
}
}
二、什么场景下使用
需要避免任务在共享资源上产生冲突。
三、源码分析
3.1 WeakReference
讲到弱引用,就需要知道其他的几个引用。在Java中有4种引用:
- 强引用
- 软引用
- 弱引用
- 虚引用
简单说下区别,①如果对象有强引用,则垃圾回收器不会回收它;
②如果对象有软引用,只有在内存空间不足,才会被回收。
③如果对象有弱引用,则每次垃圾回收时,对象都会被回收。
④虚引用不影响对象的生命周期。
为什么要有这几种引用?
- 提供通过代码的方式决定对象的生命周期
- 有利于垃圾回收
弱引用如何使用