成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不規范使用ThreadLocal導致的bug,說多了都是淚

開發 前端
我們在寫業務代碼時,正確的理解線程的全生命周期以及執行原理,對我們提升代碼的健壯性其實很有幫助。

ThreadLocal一般用于線程間的數據隔離,通過將數據緩存在ThreadLocal中,可以極大的提升性能。但是,如果錯誤的使用Threadlocal,可能會引起不可預期的bug,以及造成內存泄露。

因為線程重用導致的信息錯亂的bug

有時我們會在一個接口中緩存某些數據到ThreadLocal中,但是我們要意識到,處理請求的這些線程是由tomcat提供的,而tomcat提供的線程都是配置在一個線程池中的。

也就是說,線程是可能被重用的,如果線程一旦被重用,而ThreadLocal的數據沒有及時重置,就會導致數據被混亂使用。

以下方的接口為例,先獲取當前線程中保存的數據信息,將參數中的name保存到ThreadLocal中以后,再獲取一次。

@GetMapping(value = "/threadLocal")
public ResponseEntity<Object> threadLocal(String name) {
String before = Thread.currentThread().getName() + ":" + threadLocal.get();
//先獲取值,理論上應該是null
System.out.println("before:" + before);
threadLocal.set(name);
String after = Thread.currentThread().getName() + ":" + threadLocal.get();
//設置完參數值再獲取一次
System.out.println("after:" + after);
return ResponseEntity.ok().build();
}

為了盡快復現線程重用導致的問題,我們將
servlet.tomcat.threads.max設置為1,這樣每次請求使用的都是同一個線程。

第一次請求接口,數據看起來很正常:

但是第二次請求接口時,可以看到線程仍然是http-nio-8080-exec-1,但是before卻打印出了第一次請求的參數test。

這就是因為沒有及時重置ThreadLocal導致的數據錯誤。

正確使用的姿勢

修正的辦法就是處理完接口之后要及時清理ThreadLocal。

@GetMapping(value = "/threadLocal")
public ResponseEntity<Object> threadLocal(String name) {
try {
String before = Thread.currentThread().getName() + ":" + threadLocal.get();
//先獲取值,理論上應該是null
System.out.println("before:" + before);
threadLocal.set(name);
String after = Thread.currentThread().getName() + ":" + threadLocal.get();
//設置完參數值再獲取一次
System.out.println("after:" + after);
} finally {
//清理數據
threadLocal.remove();
}
return ResponseEntity.ok().build();
}

更優雅的處理方式

可能也有的朋友會說,每次都要使用try finally處理線程數據,未免也太麻煩了。其實,我們可以使用攔截器或者過濾器自動幫我們完成數據的初始化以及清理工作。

最后

我們在寫業務代碼時,正確的理解線程的全生命周期以及執行原理,對我們提升代碼的健壯性其實很有幫助。有時我們覺得底層原理很枯燥乏味,開發業務就是寫增刪改查,多線程用的也很少,但我們只是沒有意識到,我們的代碼一直跑在tomcat提供的線程池中,本身就是一個多線程的環境。

除了tomcat的線程池,我們自定義的線程池其實也會有這個問題,大家可以看看自己的業務代碼是否踩過這個坑。

責任編輯:姜華 來源: 今日頭條
相關推薦

2018-04-11 15:42:04

開源項目姿勢

2014-10-13 09:43:15

程序員

2021-09-11 19:00:54

Intro元素MemoryCache

2021-08-10 09:58:59

ThreadLocal內存泄漏

2021-09-27 10:15:10

故障業務方電腦

2025-06-25 09:31:41

2022-03-17 08:55:43

本地線程變量共享全局變量

2015-09-09 08:45:49

JavaThreadLocal

2021-05-06 08:55:24

ThreadLocal多線程多線程并發安全

2024-03-26 09:29:27

MySQLDDL

2016-01-05 17:59:32

VR英偉達

2009-03-09 14:22:12

ApacheJavaEEJCP

2024-06-11 00:04:00

對象AdvisorAdvice

2023-11-29 14:20:16

iOS 17Bug蘋果

2012-09-18 09:17:34

Java規范代碼代碼

2020-09-18 15:08:13

5G網絡技術

2017-10-20 14:23:01

動態數據大數據數據采集

2019-01-31 01:31:28

華為

2013-04-18 09:55:05

程序員

2009-01-04 17:08:41

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品久久久久 | 日韩一区二区三区视频 | www312aⅴ欧美在线看 | 精品久久久久久久久亚洲 | 久久99国产精品 | 在线欧美一区二区 | 亚洲一区二区三区桃乃木香奈 | 玖玖视频 | 在线视频日韩精品 | 午夜在线精品 | 国产精品久久久久久久久久久免费看 | 99久久精品国产毛片 | 在线成人 | 香蕉大人久久国产成人av | 精品国产一区二区三区av片 | 国产一级免费视频 | 国产98色在线 | 日韩 | 精品国产乱码久久久久久闺蜜 | 日韩快播电影网 | 一区二区三区视频播放 | 国产精品久久久久久久久久久免费看 | 成人在线视频一区二区三区 | 亚洲欧美激情精品一区二区 | 国产精品久久久久影院色老大 | 欧美一级二级视频 | 久久久福利 | 日韩精品亚洲专区在线观看 | 中文字幕1区 | 久久成人精品视频 | av在线免费观看网址 | 羞羞免费网站 | 国产成人99久久亚洲综合精品 | 欧美精品一区免费 | www.久久 | 亚洲成人播放器 | 精品一区二区三区在线观看国产 | 9999国产精品欧美久久久久久 | 黄色福利 | 97狠狠干| av天空| 日韩欧美中文字幕在线观看 |