ThreadLocal是依赖于线程的
ThreadLocal是依赖于线程的!
ThreadLocal是依赖于线程的,会为每个线程分配独立的空间,即使A线程上的X任务完成,如果A继续执行Y任务的话,这个分配出来的空间依旧存在并且延用。我做一些实验时候发现的可能会一不小心就出错的地方。
其输出为,
Constructor:0
Constructor:1
Constructor:2
Constructor:3
Constructor:4
1
1
1
1
1
t.set((Integer)id);这个放在构造器中,可能很直观认为,在run中输出为每个任务id+1;可是实际输出为1,即初始化ThreadLocal值以后并没有对t进行set操作。这就是因为,在构造Test1时候并没有为这个Test1的实例分配线程,所以自然不存在ThreadLocal的分配空间啦
import java.util.*; import java.util.concurrent.*; import java.util.concurrent.locks.*; import java.io.*; public class Test1 implements Runnable{ static ThreadLocal<Integer> t=new ThreadLocal<Integer>(){ @Override protected synchronized Integer initialValue(){ return new Integer(0); } }; static int count=0; final int id=count++; public Test1(){ t.set((Integer)id);//这个执行了嘛? System.out.println("Constructor:"+id); } public void run(){ t.set(t.get()+1); System.out.println(t.get()); } public static void main(String[] args){ ExecutorService exec=Executors.newCachedThreadPool(); for (int i=0;i<5;i++) exec.execute(new Test1()); exec.shutdownNow(); } }
ThreadLocal是依赖于线程的,会为每个线程分配独立的空间,即使A线程上的X任务完成,如果A继续执行Y任务的话,这个分配出来的空间依旧存在并且延用。我做一些实验时候发现的可能会一不小心就出错的地方。
其输出为,
Constructor:0
Constructor:1
Constructor:2
Constructor:3
Constructor:4
1
1
1
1
1
t.set((Integer)id);这个放在构造器中,可能很直观认为,在run中输出为每个任务id+1;可是实际输出为1,即初始化ThreadLocal值以后并没有对t进行set操作。这就是因为,在构造Test1时候并没有为这个Test1的实例分配线程,所以自然不存在ThreadLocal的分配空间啦