ThreadLocal與執行緒池使用的問題

2022-07-25 05:18:07 字數 1536 閱讀 8210

感謝博主的這篇分享,見 

在今天的面試中,突然被考官問了這個問題,當時脫口而出的是 threadlocal容易會有記憶體洩漏,需要注意remove。其實自己仔細想想,這個回答太過於結果了,沒有思考為何要配合執行緒池的時候,去remove。

注意,這裡需要你的jdk版本為1.8及以上,否者清將lambda表示式改為匿名內部類

問題的版本

1

public

class

threadlocalandpool

1112

public

static

void

remove()

1516

public

static

void

increment()

1920

public

static

void

main(string args) );32}

3334

executorservice.shutdown();35}

3637

38 }

得到的結果

threadid 12 before 0, after 1

threadid 13 before 0, after 1

threadid 12 before 1, after 2

threadid 13 before 1, after 2

threadid 12 before 2, after 3

這個其實就是threadlocal與執行緒池使用的問題了,因為threadlocal維護是 map這個結構,而執行緒池是對執行緒進行復用的,如果沒有及時的清理,那麼之前對該執行緒的使用,就會影響到後面的執行緒了,造成資料不準確。

修正的版本,就是加乙個remove

1

public

class

threadlocalandpool

1112

public

static

void

remove()

1516

public

static

void

increment()

1920

public

static

void

main(string args)

33finally

36});37}

3839

executorservice.shutdown();40}

4142

43 }

上面執行的結果如下(不同機器的threadid會有所不同)

threadid 12 before 0, after 1

threadid 13 before 0, after 1

threadid 12 before 0, after 1

threadid 13 before 0, after 1

threadid 13 before 0, after 1

ThreadLocal執行緒池例項

學習了多執行緒的理論後,下面我們來看工作中遇到的乙個具體例項。public integer startareaindex listactivityids arealist if collectionutils.isempty arealist logtypeenum.activity solr.in...

ThreadLocal和執行緒池使用要注意的乙個地方

threadlocal可以簡單理解為key為當前thread的乙個map 簡單這麼理解 是簡單這麼理解,實際並不是 具體可參看 所以它和執行緒池一起使用的時候就會出現問題了,因為我們知道執行緒池有乙個好處就是會讓執行緒重用,避免建立過多的執行緒物件。也就是說有可能會出現threadlocal中的執行...

threadLocal 和 執行緒池 問題記錄

問題 在web應用中,獲取使用者的身份後,使用filter將身份資訊採用putifabsent的形式放在了 threadlocal 中。迴圈請求servlet,發現使用者身份沒有變化。解析只有當threadlocal的生命週期受限於task的生命週期時,在thread pool的thread裡使用t...