ThreadLocal類以及應用技巧

2021-08-02 18:55:12 字數 2019 閱讀 6318

上一節總結了一下,執行緒範圍內的資料共享問題,即定義乙個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是採用雜湊表的方式來為每個執行緒都提供乙個變數的副本 而不會和其它執...