ThreadLocal分析

http://www.iteye.com/topic/757641

每个线程中都有ThreadLocalMap属性,是个map,key为ThreadLocal,value为存在ThreadLocal里的内容如:
private static ThreadLocal<List<String>> store = new ThreadLocal<List<String>>(){
		@Override
		protected List<String> initialValue() {
			// TODO Auto-generated method stub
			return new LinkedList<String>(); 
		}
	};
 List<String> list = store.get();  

多线程的时候,每个线程第一次调用store.get();方法时都会去调ThreadLocal的initialValue方法,初始化ThreadLocalMap里的value,多个线程的ThreadLocalMap共用一个ThreadLocal作为key,也就是每个线程都会new LinkedList一次,然后从ThreadLocal里拿。
因为LinkedList或是SimpleDateFormat都不是线程安全的,所以每个线程都需要自己创建,而不能共用一个静态的变量,多次使用会创建多个生命周期很短的实例,性能开销大,代替是将SimpleDateFormat作为参数传递下去,这样不好,还有一种方法是用ThreadLocal,每个线程只创建一次并且归属于本线程所有,是以空间换时间。
synchornized是以时间换空间

你可能感兴趣的:(threadLocal)