reentlock
的實(shí)現(xiàn)依賴硬件支持CAS操作
Compare and swap
原始值吕粗,目標(biāo)值互婿,期望值
當(dāng)目標(biāo)值 = 期望值時(shí),認(rèn)為修改成功簇秒。
當(dāng)目標(biāo)值 鱼喉!= 期望值時(shí),肯定是別的操作已經(jīng)修改了趋观。放棄
jdk下的并發(fā)包Atomic目錄下的類就是封裝了原子的操作類
AQS內(nèi)部抽象類
AbstractQueuedSynchronizer
主要的成員變量
state volitile修飾表示鎖被搶占的狀態(tài)扛禽,對它的修改都是用的cas操作
一個(gè)雙向鏈表,其中每個(gè)Node節(jié)點(diǎn)信息:
waitstatus四個(gè)狀態(tài)值singal cancel 初始化 condition 獨(dú)占模式還是共享模式
線程的信息
前序節(jié)點(diǎn) 后序節(jié)點(diǎn)
加鎖的過程
公平鎖皱坛,直接放到隊(duì)列尾
非公平鎖编曼,先嘗試加鎖,沒有搶到放到隊(duì)尾
查看status是否為0剩辟,是的線程搶占到鎖掐场。
不為0,則addWaiter操作贩猎,在雙向鏈表的尾部添加node節(jié)點(diǎn)熊户。這步操作也是CAS操作,保證多線程的安全吭服。
之后進(jìn)入死循環(huán)嚷堡,檢查前序節(jié)點(diǎn)是否為head節(jié)點(diǎn)。
前序節(jié)點(diǎn)是head的話艇棕,搶占鎖蝌戒。如果不是head節(jié)點(diǎn)的話,線程進(jìn)入阻塞狀態(tài)沼琉。
解鎖的過程
解鎖后北苟,status-1。當(dāng)status為0時(shí)打瘪。
通知head節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)友鼻,喚醒狀態(tài)。從而進(jìn)入上述的死循環(huán)闺骚。
引用:https://blog.csdn.net/javazejian/article/details/75043422