上一節總結了一下,執行緒範圍內的資料共享問題,即定義乙個map,將當前執行緒名稱和執行緒中的資料以鍵值對的形式存到map中,然後在當前執行緒中使用資料的時候就可以根據當前執行緒名稱從map中拿到當前執行緒中的資料,這樣就可以做到不同執行緒之間資料互不干擾。其實threadlocal類就是給我們提供了這個解決方法,所以我們完全可以用threadlocal來完成執行緒範圍內資料的共享。
public
class
threadscopesharedata
}).start();}}
static class testa
}static class testb
}}
結合上一節的**,可以看出,其實threadlocal就相當於乙個map,只不過我們不需要設定key了,它預設就是當前的thread,往裡面放資料,直接set即可,取資料,直接get即可,很方便,就不用map乙個個存了,但是問題來了,threadlocal雖然訪問方便,但是get()方法中根本沒有引數,也就是說我們只能往threadlocal中放乙個資料,多了就不行了,那麼該如何解決這個問題呢?
很明顯,threadlocal是個容器,且只能存一下,那麼如果有多個資料,我們可以定義乙個類,把資料都封裝到這個類中,然後扔到threadlocal中,用的時候取這個類,再從類中去我們想要的資料即可。
好,現在有兩個執行緒,每個執行緒都要操作各自的資料,而且資料有兩個:名字和年齡。根據上面的思路,寫乙個demo,如下:
public
class
threadscopesharedata
}).start();}}
static class testa
}static class testb
}}//定義乙個user類來儲存姓名和年齡
class user
public
void
setname(string name)
public
intgetage()
public
void
setage(int age)
}
public
class
singleton
public
static
synchronized singleton getinstance()
return instance; //返回該例項
} }
這是懶漢式單例模式的**結構,我門完全可以效仿該思路去設計乙個從當前執行緒中拿user的辦法,所以將程式修改如下:
public
class
threadscopesharedata
}).start();}}
static class testa
}static class testb
}}class user
private
static threadlocalthreadlocal = new threadlocal();
//注意,這不是單例,每個執行緒都可以new,所以不用synchronized,
//但是每個threadlocal中是單例的,因為有了的話就不會再new了
public
static /*synchronized*/ user getthreadinstance()
return instance; //向外返回該user
}private string name;
private
int age;
public string getname()
public
void
setname(string name)
public
intgetage()
public
void
setage(int age)
}
JAVA基礎特性 ThreadLocal 應用
threadlocal是什麼呢?其實threadlocal並非是乙個執行緒的本地實現版本,它並不是乙個thread,而是thread local variable 執行緒區域性變數 也許把它命名為threadlocalvar更加合適,他實現了執行緒的變數隔離,不同的執行緒可以維護自己的變數,他在內部...
執行緒ThreadLocal類
threadlocal 在很多地方叫做本地變數,在有些地方叫做執行緒本地儲存。threadlocal 在每個執行緒中為每個變數都建立了乙個副本,每個執行緒可以訪問自己內部的副本變數,而不會對其它執行緒的副本變數造成影響。如果看不懂沒關係,下面會解釋各個函式的意思。public t get publi...
執行緒相關類(ThreadLocal類)
threadlocal,是tread local varcable 執行緒區域性變數 的意思。執行緒區域性變數 threadlocal 的功能其實非常簡單,就是為每乙個使用該變數的執行緒都提供乙個變數值的副本 threadlocal是採用雜湊表的方式來為每個執行緒都提供乙個變數的副本 而不會和其它執...