首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

ThreadLocal是依赖于线程的

2012-12-22 
ThreadLocal是依赖于线程的!import java.util.*import java.util.concurrent.*import java.util.concurr

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>(){@Overrideprotected 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的分配空间啦

热点排行