ããThreadLocalæ¯è§£å³çº¿ç¨å®å
¨é®é¢ä¸ä¸ªå¾å¥½çæè·¯ï¼å®éè¿ä¸ºæ¯ä¸ªçº¿ç¨æä¾ä¸ä¸ªç¬ç«çåéå¯æ¬è§£å³äºåé并å访é®çå²çªé®é¢ãå¨å¾å¤æ
åµä¸ï¼ThreadLocalæ¯ç´æ¥ä½¿ç¨synchronizedåæ¥æºå¶è§£å³çº¿ç¨å®å
¨é®é¢æ´ç®åï¼æ´æ¹ä¾¿ï¼ä¸ç»æç¨åºæ¥ææ´é«ç并åæ§ã
ãã对äºå¤çº¿ç¨èµæºå
±äº«çé®é¢ï¼åæ¥æºå¶éç¨äºâ以æ¶é´æ¢ç©ºé´âçæ¹å¼ï¼èThreadLocaléç¨äºâ以空é´æ¢æ¶é´âçæ¹å¼ãåè
ä»
æä¾ä¸ä»½åéï¼è®©ä¸åç线ç¨æé访é®ï¼èåè
为æ¯ä¸ä¸ªçº¿ç¨é½æä¾äºä¸ä»½åéï¼å æ¤å¯ä»¥åæ¶è®¿é®èäºä¸å½±åã
ããThreadLocal 并ä¸è½æ¿ä»£åæ¥æºå¶ï¼ä¸¤è
é¢åçé®é¢é¢åä¸åã
ãã1ï¼åæ¥æºå¶æ¯ä¸ºäºåæ¥å¤ä¸ªçº¿ç¨å¯¹ç¸åèµæºç并å访é®ï¼æ¯ä¸ºäºå¤ä¸ªçº¿ç¨ä¹é´è¿è¡éä¿¡çæææ¹å¼ï¼
ãã2ï¼èthreadLocalæ¯é离å¤ä¸ªçº¿ç¨çæ°æ®å
±äº«ï¼ä»æ ¹æ¬ä¸å°±ä¸å¨å¤ä¸ªçº¿ç¨ä¹é´å
±äº«åéï¼è¿æ ·å½ç¶ä¸éè¦å¯¹å¤ä¸ªçº¿ç¨è¿è¡åæ¥äºã
ããimport java.util.Random;
public class ThreadSocpeShareData {
static ThreadLocal<Integer> t = new ThreadLocal<Integer>();
public static void main(String[] args) {
for(int i=0;i<3;i++){
new Thread(new Runnable() {
@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName() +" has put "+ data);
t.set(data);
MyThreadScopeData.getInstance().setName("name" + data);
MyThreadScopeData.getInstance().setAge("age"+data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get(){
int data = t.get();
MyThreadScopeData myData = MyThreadScopeData.getInstance();
System.out.println("A " + Thread.currentThread().getName() +" "+ data + myData.getAge() + myData.getName() /*ms.getName()*/);
}
}
static class B{
public void get(){
int data = t.get();
System.out.println("B " + Thread.currentThread().getName()+ " "+ data);
}
}
}
class MyThreadScopeData{
private MyThreadScopeData(){}
private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
public static MyThreadScopeData getInstance(){
MyThreadScopeData instance = map.get();
if(instance == null){
instance = new MyThreadScopeData();
map.set(instance);
}
return instance;
}
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
ããäºå®ä¸ï¼æ们åThreadLocalä¸setçåéä¸æ¯ç±ThreadLocalæ¥åå¨çï¼èæ¯Thread线ç¨å¯¹è±¡èªèº«ä¿åãå½ç¨æ·è°ç¨ThreadLocal对象çset(Object o)æ¶ï¼è¯¥æ¹æ³åéè¿Thread.currentThread()è·åå½å线ç¨ï¼å°åéåå
¥Threadä¸çä¸ä¸ªMapå
ï¼èMapçKeyå°±æ¯å½åçThreadLocalå®ä¾ã请çæºç ï¼è¿æ¯æ主è¦ç两个å½æ°ï¼è½çåºThreadLocalä¸Threadçè°ç¨å
³ç³»ï¼
ããpublic void set(T value) {
ããããThread t = Thread.currentThread(); ã
ããããThreadLocalMap map = getMap(t); ã
if (map != null) ã
ããããããmap.set(this, value); ã
else
ããããããcreateMap(t, value); ã
} ã
ThreadLocalMap getMap(Thread t) { ã
return t.threadLocals; ã
}ã
ããpublic void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
ããå
·ä½å¯ä»¥ççéé¢çæºç ï¼ä¸è¿æä¸ç¹æ¯å¯ä»¥è¯å®çï¼å°±æ¯Threadlocalä¸ å建ç线ç¨å¯æ¬ï¼å¯ä»¥ä¸è°ç¨removeæ¥åæ¸
çå·¥ä½ï¼å 为jvmå¨åç°çº¿ç¨çè°ä½£ä¸å使ç¨æ¶ï¼ä¼è¿è¡èªå¨çåå¾åæ¶æä½ï¼æ以ååç¨åºå¨ä½¿ç¨Threadlocalæ¶å´æ¯ç»å¸¸çè¿è¡ä½¿ç¨å®æä¹åçæ¸
çå·¥ä½ãï¼é²æ¢å ç¨å
åï¼å¦æå建çå¯æ¬æ°éä¸æ¯å¤ªå¤çè¯ï¼å¯ä»¥è®©èææºèªå¨æ¥æ¸
é¤ï¼
温馨提示:答案为网友推荐,仅供参考