![240](https://cdn2.jianshu.io/assets/default_avatar/12-aeeea4bedf10f2a12c0d50d626951489.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240)
歡迎關(guān)注我的github峻凫,以后所有文章源碼都會陸續(xù)更新上去 遇到的困境 現(xiàn)我們服務(wù)提供端有如下的根據(jù)用戶查詢條件獲取滿足條件的用戶列表controller接口 我們在使用Fe...
//ThreadLocalMap類 → set()方法
private void set(ThreadLocal<?> key, Object value) {
// 獲取table及其長度
Entry[] tab = table;
int len = tab.length;
// 使用key的哈希值和數(shù)組長度計算獲取索引值
int i = key.threadLocalHashCode & (len-1);
// 遍歷table如果已經(jīng)存在則更新值被盈,不存在則創(chuàng)建
for (Entry e = tab[i];
e != null;
e = tab[i = nextIndex(i, len)]) {
ThreadLocal<?> k = e.get();
// 如果key相同析孽,則使用新value替換老value
if (k == key) {
e.value = value;
return;
}
// 如果table[i]為空則創(chuàng)建新的Entry存儲
if (k == null) {
replaceStaleEntry(key, value, i);
return;
}
}
// table[i]不為null且key不相同的情況下,
// 如果遍歷完數(shù)組也沒有找到為null的位置只怎,
// 則代表數(shù)組需要擴容,則將數(shù)組擴容兩倍
tab[i] = new Entry(key, value);
int sz = ++size;
// 如果清理過期的數(shù)據(jù)之后怜俐,數(shù)組內(nèi)的可用數(shù)據(jù)還占
// 3/4的情況下身堡,直接擴容兩倍
if (!cleanSomeSlots(i, sz) && sz >= threshold)
rehash();
}
老哥,你這里的分析應(yīng)該是錯了的拍鲤,使用key的哈希值和數(shù)組長度計算獲取索引值后贴谎,嘗試獲取對應(yīng)數(shù)據(jù)的數(shù)據(jù),如果獲取到的key相同則替換季稳,但是如果k為空(什么時候會空擅这,因為是弱引用,只有g(shù)c后景鼠,自然為空)仲翎,這個時候,就創(chuàng)建替換entry(目的復用空間)铛漓。如果不為空且k不同溯香,則去找一個為空的tab[i],直到找到后退出循環(huán),然后根據(jù)此時的大小浓恶,如果超過閾值玫坛,就擴容。你這里的分析不太對的包晰。
(七)全面剖析Java并發(fā)編程之線程變量副本ThreadLocal原理分析引言 在之前的文章:徹底理解Java并發(fā)編程之Synchronized關(guān)鍵字實現(xiàn)原理剖析[http://www.reibang.com/p/884eb51266e4]中我們...
預(yù)計閱讀:10分鐘 一伐憾、說明 在上一篇中勉痴,介紹了RabbitMQ中的死信隊列是什么,何時使用以及如何使用RabbitMQ的死信隊列塞耕。相信通過上一篇的學習蚀腿,對于死信隊列已經(jīng)有了...
@竹子愛熊貓
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
這里不是莉钙,當前驅(qū)節(jié)點是head節(jié)點,就嘗試加鎖筛谚。如果加鎖成功磁玉,就設(shè)置為頭結(jié)點,并占用線程嗎驾讲。然后如果前驅(qū)節(jié)點部署head節(jié)點蚊伞,就shouldParkAfterFailedAcquire席赂,判斷前驅(qū)節(jié)點的狀態(tài),如果狀態(tài)是-1 signal的話时迫,就要去調(diào)用parkAndCheckInterrupt去調(diào)用阻塞颅停。如果是狀態(tài)>0的話,就去掉改前驅(qū)節(jié)點再來一遍掠拳。我主要是不理解癞揉,這里為什么說有自旋。這里怎么自旋了溺欧。是指的這里的喊熟,去掉不通知的前驅(qū)節(jié)點嗎。
(五)深入剖析并發(fā)之AQS獨占鎖&重入鎖(ReetrantLock)及Condition實現(xiàn)原理引言 在我們前面的文章《深入理解Java并發(fā)編程之無鎖CAS機制[http://www.reibang.com/p/e334f02dd664]》中我們曾提到的CAS機制如果...
當一個線程執(zhí)行ReetrantLock.lock()方法獲取鎖失敗時姐刁,該線程會被封裝成Node節(jié)點加入同步隊列等待鎖資源的釋放芥牌,期間不斷執(zhí)行自旋邏輯。 應(yīng)該沒有自旋吧聂使,我覺得應(yīng)該是如果嘗試獲取同步狀態(tài)壁拉,一旦失敗就會阻塞shouldParkAfterFailedAcquire(p, node)。
(五)深入剖析并發(fā)之AQS獨占鎖&重入鎖(ReetrantLock)及Condition實現(xiàn)原理引言 在我們前面的文章《深入理解Java并發(fā)編程之無鎖CAS機制[http://www.reibang.com/p/e334f02dd664]》中我們曾提到的CAS機制如果...
@竹子愛熊貓 我的意思是希望大佬能輸出更多優(yōu)質(zhì)文章岩遗。
(二)深入理解Java并發(fā)編程之Synchronized關(guān)鍵字實現(xiàn)原理剖析引言 Synchronized關(guān)鍵字(互斥鎖)原理扇商,一線大廠不變的面試題,同時也是理解Java并發(fā)編程必不可少的一環(huán)宿礁!其中覆蓋的知識面很多案铺,需要理解的點也很多,本文是以相關(guān)書...
大佬的文章是我看過寫的最好的梆靖,希望大佬繼續(xù)更新控汉。
(二)深入理解Java并發(fā)編程之Synchronized關(guān)鍵字實現(xiàn)原理剖析引言 Synchronized關(guān)鍵字(互斥鎖)原理,一線大廠不變的面試題返吻,同時也是理解Java并發(fā)編程必不可少的一環(huán)姑子!其中覆蓋的知識面很多,需要理解的點也很多测僵,本文是以相關(guān)書...
Java Thread 如何正確停止線程 錯誤的停止方法 1街佑、被棄用的stop、suspend和resume方法 模擬指揮軍隊:一共有5個連隊捍靠,每個連隊10人沐旨,以連隊為單位,...
以我的知識儲備來說的話歪脏,spring的@Valid如果是注解在類上的話,用的是springmvc的RequestResponseBodyMethodProcessor后置處理器在注入?yún)?shù)的時候進行參數(shù)校驗粮呢,而如果是普通的方法參數(shù)校驗的話唾糯,基本是通過aop,MethodValidationPostProcessor動態(tài)注入aop切面進行校驗的鬼贱。應(yīng)該是不用filter的。但是如果你說你是想注入自定義的filter話香璃,樓主也講的比較清楚这难。springboot獲取filter有這么幾個方法,1是在spring自己通過類型獲取所有的filter葡秒,這時候就是指的@component姻乓,這個時候通過order可以指定鏈的順序。2.也可以注冊一個RegistrationBean眯牧,這個時候也能通過指定order值來指定過濾鏈的順序蹋岩。而@webfilter其實也是通過處理類在spring中注冊了一個RegistrationBean,但是因為@webfilter沒有order屬性学少,所以@webfilter注冊的都是沒有順序的剪个。 因此你的幾個問題,1.springmvc加載filter是為了構(gòu)建過濾器鏈版确,設(shè)置最小級別的話扣囊,指的是放在鏈路開頭。其他的filter只是后執(zhí)行绒疗。2.直接返回侵歇,不放行過濾器鏈的話,后續(xù)的filter是用不到了吓蘑。這個我建議你去看下責任鏈模式惕虑。
別小看“Spring過濾器”,這些知識點你必須得掌握磨镶!容器啟動時過濾器初始化以及排序注冊相關(guān)邏輯溃蔫。 1 @WebFilter過濾器使用@Order無效 啟動程序: Controller: 實現(xiàn)倆過濾器: AuthFilter T...
Spring 監(jiān)聽器listener原理-基本使用(一)[http://www.reibang.com/p/bf5577e7ec6f] Spring 監(jiān)聽器listener...
上一篇我們介紹了服務(wù)的注冊發(fā)現(xiàn),本篇文章我們再來聊聊另一個問題——全鏈路日志网沾。 為了便于理解癞蚕,我們依然從業(yè)務(wù)場景入手。 一辉哥、業(yè)務(wù)場景 當時公司的微服務(wù)剛剛遷移到Springc...
參考文章 : W3C_0101博文鏈接[https://blog.csdn.net/weixin_38117908/article/details/107285978] 前言...