????????ThreadLocal
????ThreadLocal???????????????????????????????????????????????????????????????????????????????????????ThreadLocal??????????????Χ????????????????
????????????
????????????????????????ThreadLocal??synchronized????????????????????????????sysnchronized???????????????????????????????????????????????????????ThreadLocal??????????????????????“????”????????????????????????????????????????????????????ThreadLocal??????????????????÷?Χ???????????????????У????????????????“????”??
???????ThreadLocal?????????????????????????????????????????????????????и?????????????????????ε?????????????????????????????????????????????д??????ThreadLocal???????????????????????????????????“??????ε?”??????????????get???????????????????????????????“????????”???????????
??????????????????
????????????????????????????????????????????????????????η???????????????????????ThreadLocal??.???????????????????????????????緽?????????????????
package concurrent;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by chengxiao on 2016/12/12.
*/
public class ThreadLocalDemo {
public static void main(String []args){
for(int i=0;i<5;i++){
final Thread t = new Thread(){
@Override
public void run(){
System.out.println("??????:"+Thread.currentThread().getName()+"???????ID:"+ThreadId.get());
}
};
t.start();
}
}
static   class ThreadId{
//????????????У????AtomicInger??????????????
private static final AtomicInteger nextId = new AtomicInteger(0);
//?????????????????????????????
private static final ThreadLocal<Integer> threadId =
new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return nextId.getAndIncrement();//????nextId++??????nextId++??????????????????????????????????????????(?????????????????????ID???????????????
}
};
//??????????????У?????????get?????????initialValue?????濴????????
public static int get() {
return threadId.get();
}
}
}
??????н?????????????????????????????ID???????????Χ???"?κε??"??????????????ThreadId.get()?????????????
??????????:Thread-4???????ID:1
??????????:Thread-0???????ID:0
??????????:Thread-2???????ID:3
??????????:Thread-1???????ID:4
??????????:Thread-3???????ID:2
???????????
????set???????????????
public void set(T value) {
Thread t = Thread.currentThread();//1.???????????????
ThreadLocalMap map = getMap(t);//2.????????????ThreadLocalMap
if (map != null)
map.set(this?? value);//???map?????????set??????????threadLocal?????key?????洢?????value????set????
else
createMap(t?? value);//???map???????????????ThreadLocalMap
}
?????????????ThreadLocal????????????????????????????????
????ThreadLocalMap getMap(Thread t) {
????return t.threadLocals;//?????????ThreadLocalMap??????
????}
???????????Thread???е???壬???????????????ThreadLocalMap????
????ThreadLocal.ThreadLocalMap threadLocals = null;
??????????????????ThreadLocal???????????
????1.ThreadLocal????????????????????
????2.????Thread?????????ThreadLocalMap???????ThreadLocalMap???ж?????????
????3.ThreadLocalMap??????threadlocal?????key??????????洢?????value??get????threadlocal?????????????????????????
???????????????????????Щ????????????????????Map<Thread??T>?????????????????????洢????ThreadLocal??????????????????????
??????????????????????????????????????????ThreadLocalMap?е???????????????????map????????????????????????????