五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(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ó)家法律
应用必备| 宁德市| 江都市| 鱼台县| 东辽县| 元氏县| 梧州市| 金寨县| 黎川县| 四川省| 卢湾区| 祥云县| 乌什县| 祁连县| 瓦房店市| 津南区| 神农架林区| 仁怀市| 新乡市| 长宁区| 枣阳市| 三亚市| 巴塘县| 淮阳县| 内黄县| 遂昌县| 炎陵县| 博野县| 临泽县| 浦县| 巴林左旗| 双江| 金堂县| 泾阳县| 长岛县| 靖宇县| 双牌县| 通江县| 绥中县| 晋城| 临朐县|