2017-08-18 109 views
0
public class App 
{ 
    public static void main(String[] args) 
    { 
     ThreadLocal<String> threadLocal = new ThreadLocal<String>(); 
     threadLocal.set("String1"); 
     threadLocal.set("String2"); 
     threadLocal.set("String3"); 

     System.out.println("=============="); 
     System.out.println("++ " + threadLocal.get()); 
     System.out.println("++ " + threadLocal.get()); 
    } 
} 


the output is 
============= 
++ String3 
++ String3 

請參閱源代碼中的set方法,對於指定的Thread,它的threadlocalmap只能容納一個map條目?如示例所示,map.set(this,value);這裏「this」是var「threadLocal」,所以「String3」將覆蓋之前的值。 我誤會嗎?ThreadLocal源代碼混亂

public void set(T value) { 
     Thread t = Thread.currentThread(); 
     ThreadLocalMap map = getMap(t); 
     if (map != null) 
      map.set(this, value);// here "this" is the var "threadLocal" 
     else 
      createMap(t, value); 
    } 
+0

是,'ThreadLocal'只能在同一時間有一個值。 – shmosel

+1

您也可以以澄清你的疑問和看到「設置(T值)」的方法定義閱讀「ThreadLocal的」文檔。 https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html –

回答

1

ThreadLocal是當前線程的本地成員/變量;所以每個線程只有一個值。

在有對價值類型沒有限制被設置,在你的例子你將其設置爲字符串的同時,同樣這可能是類集合的實例。

當你希望所有的值可以從你的代碼,然後把它們放在一起的集合(列表),或收集所有你想要的值自定義類型英寸

1

ThreadLocal從主題映射到值。當從同一個線程詢問時 - 所以使用相同的鍵 - 返回的值當然是相同的。

這是ThreadLocal的宗旨:始終提供相同價值的線索。