国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

ThreadLocal錯(cuò)誤示范

2022-04-13 10:26 作者:free-coder  | 我要投稿

1 接口返回對(duì)象封裝到ThreadLocal

????服務(wù)接口返回的Response對(duì)象有仨字段code,msg和data,每次成功的返回都是code=0,msg=success,只修改data部分。想著要不就把Response對(duì)象封裝到ThreadLocal中,每次從ThreadLocal去get,然后setData,然后return。

????這樣做的話,服務(wù)如果有300個(gè)線程的池子,那就只需要300個(gè)Response對(duì)象,不用每次新請(qǐng)求來(lái)都重新new一遍啦,可以減少gc??此坪芾硐耄瑢?shí)際上會(huì)出問(wèn)題,服務(wù)常用的網(wǎng)絡(luò)框架netty需要對(duì)return的這個(gè)Response對(duì)象序列化,序列化過(guò)程是扔到一個(gè)隊(duì)列中來(lái)處理,是將對(duì)象引用扔過(guò)來(lái),如果使用ThreadLocal,在return之后該線程結(jié)束,下一個(gè)新請(qǐng)求如果被該線程承接,就會(huì)set成新的data,這時(shí)候netty隊(duì)列可能還沒(méi)處理到這個(gè)對(duì)象,就會(huì)導(dǎo)致結(jié)果返回到client端之前就被篡改。

????所以不要對(duì)接口返回對(duì)象封裝成ThreadLocal,就每次new就好啦。


2 線程池中的線程可以啟動(dòng)線程,并且CallerRun拒絕策略

????使用ThreadLocal有個(gè)很好的習(xí)慣就是在finally中remove,但是當(dāng)使用ForkedJoinPool的時(shí)候或者線程池中線程可以從池子中拿新線程啟動(dòng)任務(wù)的時(shí)候,可能會(huì)出現(xiàn)空指針,這是怎么回事呢。

????池子中一個(gè)線程T1需要啟動(dòng)一個(gè)新的任務(wù)他就從池子中去拿,但是發(fā)現(xiàn)線程池滿,就被拒絕了,然后策略是CallerRun,那就自己來(lái)阻塞式的執(zhí)行這個(gè)新的任務(wù)。每個(gè)任務(wù)都是需要getThreadLocal最后removeThreadLocal。

????因?yàn)閳?zhí)行新任務(wù)的時(shí)候,在任務(wù)臨終前remove掉了ThreadLocal,導(dǎo)致棧退上來(lái)之后,當(dāng)前T1上下文ThreadLocal無(wú)了,繼續(xù)往下執(zhí)行就get不到了。

????所以使用線程池的時(shí)候,盡量避免池子中的線程可以創(chuàng)建新的線程。使用ForkedJoinPool的時(shí)候,自己要特別注意ThreadLocal的處理,可以在線程開(kāi)始的地方先get出內(nèi)容,防止后面get不到了。

ThreadLocal錯(cuò)誤示范的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
石台县| 阿拉善左旗| 汾阳市| 资中县| 东平县| 安庆市| 临猗县| 同德县| 永济市| 胶州市| 武安市| 德阳市| 安达市| 尖扎县| 客服| 长治县| 会理县| 淮北市| 大埔县| 邹平县| 大渡口区| 克东县| 龙里县| 大石桥市| 德昌县| 定安县| 保德县| 岳阳县| 临城县| 云林县| 南陵县| 德庆县| 卢氏县| 伊吾县| 大庆市| 沂南县| 天柱县| 商洛市| 峨山| 长治县| 鹤庆县|