之前在牛客网的中级项目实战中,有使用线程本地存储ThreadLocal来保存登录用户的信息,以便后续调用,这里专门记录下它的特性。
线程本地存储在多线程里的应用是解决多任务对共享资源的冲突问题,它可以根除对变量的共享,它可以为使用相同变量/对象的每个不同线程都创建不同的存储,将为每个线程管理其各自的副本。
如下是一个通过ThreadLocal来管理各自Integer对象的案例:
public class Accessor implements Runnable {
public int id;
public Accessor(int id) {
super();
this.id = id;
}
@Override
public void run() {
// TODO Auto-generated method stub
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>() {
private Random rand=new Random(45);
@Override
protected synchronized Integer initialValue() {
// 当get()无值时,为每个线程的调用创建初始化值
return rand.nextInt(1000);
}
};