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

強烈反對使用Spring封裝的多線程類!

開發 架構
創建線程有那么難么?需要使用Spring創建的線程?有時候我實在是想不通,暴露出這樣的接口目的是為了什么。

本文轉載自微信公眾號「小姐姐養的狗」,作者小姐姐味道。轉載本文請聯系小姐姐養的狗公眾號。

在很久很久之前,我有一段痛苦的記憶。那種被故障所驅使的感覺,在我腦海里久久無法驅散。

原因無它,有小伙伴開啟了線程池的暴力使用模式。沒錯,就是下面這篇文章。

奪命故障 ! 炸出了投資人!

我有必要簡單的復述一下。其主要原因,就是開發人員,在每一次方法調用里,都創建了一個單獨的線程池去處理。這樣的話,如果請求量一增加,整個操作系統的壓力就會耗盡,最終所有的業務都無法響應。

我一直認為這是一個非常偶發的低級錯誤,發生頻率非常的低。但隨著這樣的故障越來越多,xjjdog認識到這是一個普遍的現象。

以異步性能優化為目的,反而帶來的整體業務不可用的結果,是非常打臉的一種優化。

1.Spring的異步代碼

Spring作為Java屆的杠把子框架,其過度封裝的API深得開發人員的喜愛。根據語義化編程的邏輯,只要某些關鍵字在語言層面上過得去,我們就可以把它給加上去。比如@Async注解。

我永遠想不通是什么給了開發人員勇氣,去加上這個@Async注解,因為這種涉及到多線程的東西,即使是自己去創建線程,也是心懷敬畏,唯恐擾了操作系統的安寧。@Async這樣的黑盒,真的可以那么順暢的使用么?

我們不妨debug一下代碼,讓子彈飛一會兒。

首先,生成一個小小的項目,然后在主類上加上必須的注解。嗯,別忘了這一環,否則你后面加的注解將沒什么用處。

@SpringBootApplication
@EnableAsync
public class DemoApplication {

創造一個帶@Async注解的方法。

@Component
public class AsyncService {
@Async
public void async(){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread());
}catch (Exception ex){
ex.printStackTrace();
}
}
}

然后,做一個對應的test接口,訪問時會調用這個async方法。

@ResponseBody
@GetMapping("test")
public void test(){
service.async();
}

訪問時,直接打個斷點,即可獲取執行異步線程的線程池。

可以看到,異步任務使用了一個線程池,它的corePoolSize=8, 阻塞隊列采用了無界隊列LinkedBlockingQueue。一旦采用了這樣的組合,最大線程數就會形同虛設,因為超出8個線程的任務,將全部會被放到無界隊列里。使得下面的代碼變成了擺設。

throw new TaskRejectedException("Executor [" + executor + "] did not accept 
task: " + task, var4);

如果你的訪問量非常大,這些任務將全部堆積在LinkedBlockingQueue里。情況好一點的,這些任務的執行會變得延遲很大;情況壞一點的,任務太多將直接造成內存溢出OOM!

你可能會說,我可以自己指定另外一個ThreadPoolExceute,然后使用@Async注解來聲明啊。說這話的同學,一定是能力比較強,或者Review的代碼比較少,沒有經過豬隊友的洗禮。

2.是SpringBoot救了你

SpringBoot是個好東西。

在TaskExecutionAutoConfiguration中,通過生成ThreadPoolTaskExecutor的Bean,來提供默認的Executor。

@ConditionalOnMissingBean({Executor.class})
public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
return builder.build();
}

也就是我們上面所說的那個。如果沒有SpringBoot的助力,Spring將默認使用SimpleAsyncTaskExecutor。

參見

org.springframework.aop.interceptor.AsyncExecutionInterceptor。

@Override
@Nullable
protected Executor getDefaultExecutor(@Nullable BeanFactory beanFactory) {
Executor defaultExecutor = super.getDefaultExecutor(beanFactory);
return (defaultExecutor != null ? defaultExecutor : new SimpleAsyncTaskExecutor());
}

這就是Spring大仙所干的事。

SimpleAsyncTaskExecutor類設計的非常操蛋,因為它每執行一次,都會創建一個單獨的線程,根本沒有共用線程池。比如你的TPS是1000,異步執行了任務,那么你每秒將會生成1000個線程!

這明顯是想要累死操作系統的節奏。

protected void doExecute(Runnable task) {
Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task));
thread.start();
}

3.End

明眼人一看,這種使用new線程的處理方式將會是非常可怕的。但就拿Spring本身來說,引用SimpleAsyncTaskExecutor這個類的地方還不少,包括比較流行的AsyncRestTemplate。

這暴露了很多風險,尤其是竟然在這些列表中看到了redis的身影。這個類的設計,使得任務的執行變的非常的不可控。

看這個API,我感覺Spring是進入了設計的魔怔狀態。

這個東西的隱藏bug可能還會更深!比如org.springframework.context.event.EventListener注解,用于實現DDD那套所謂的事件驅動模式,有不少框架直接set了AsyncRestTemplate,那么就等死吧。

趕緊把SimpleAsyncTaskExecutor加入你的API黑名單,或者埋坑清單吧!

創建線程有那么難么?需要使用Spring創建的線程?有時候我實在是想不通,暴露出這樣的接口目的是為了什么。

就連原生的線程池我們還沒搞明白呢,你還給包了一層,這是方便我們甩鍋啊!

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。


責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2015-11-18 18:56:36

Java多線程處理

2025-02-27 10:38:51

2009-09-15 09:44:00

北電企業網

2010-03-15 18:42:52

Java多線程

2021-09-11 15:26:23

Java多線程線程池

2022-05-20 10:20:17

Spring事務MyBatis

2016-11-10 16:30:22

Java多線程

2009-06-29 17:54:10

Java多線程Thread類創建線程

2021-04-12 08:56:00

多線程Future模式

2009-09-22 17:21:24

線程局部變量

2022-05-27 08:16:37

Thread類Runnable接口

2009-06-29 18:26:11

Java多線程Synchronize同步類

2009-06-29 18:08:51

Java多線程join方法

2013-06-07 16:30:08

iOS多線程iOS開發NSThread

2021-11-15 12:39:46

芯片美國英特爾

2009-06-29 18:00:05

Java多線程Runnable接口創建線程

2022-09-29 09:19:04

線程池并發線程

2009-12-08 12:14:43

2022-06-15 07:32:35

Lock線程Java

2024-01-15 10:55:40

Python多線程開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产一区二区三区 | 欧美三级视频在线观看 | 国产精品久久久久久久岛一牛影视 | 99re在线视频免费观看 | 精品日韩一区二区三区 | 日韩精品无码一区二区三区 | 日韩午夜在线观看 | 天天色天天射天天干 | 日本久久久一区二区三区 | 国产欧美精品一区二区色综合朱莉 | 久久中文一区二区 | 亚洲精品久久区二区三区蜜桃臀 | 国产一级一片免费播放 | 操久久| 国产在线精品一区 | 中文字幕一区二区三区乱码在线 | 国产精品a一区二区三区网址 | 欧美在线网站 | www.性色| 伊人久久大香线 | 99视频在线免费观看 | 怡红院免费的全部视频 | 中文字幕视频免费 | 午夜免费电影院 | 久久久久久久一区 | 91精品国产乱码麻豆白嫩 | 国内精品久久久久久影视8 最新黄色在线观看 | 国产成人综合网 | 黄网免费看 | 日韩av网址在线观看 | 久久久99精品免费观看 | 国产精品乱码一区二区三区 | 成人在线免费网站 | 成人一区二区三区视频 | 成人免费大片黄在线播放 | www.久久久.com| 欧美人妖网站 | 日韩中文字幕免费 | 免费高潮视频95在线观看网站 | 国内自拍真实伦在线观看 | 97色在线观看免费视频 |