synchronized
保證一段代碼的執(zhí)行是原子性的,同時只能被一個線程執(zhí)行
非公平鎖顷霹,不會按照等待鎖的順序讓線程獲得鎖
鎖的升級過程
偏向鎖
為什么會出現(xiàn)偏向鎖观堂?用到synchronized的地方,大部分情況下都是單線程在使用猬仁,為了提高效率蚜点,在當做鎖的Object對象的對象頭里面記錄下當前線程的線程id; 表示占用鎖
輕量鎖 (自旋鎖)
自適應自旋鎖
自旋鎖轧房,線程是活躍的,消耗cpu
自適應自旋绍绘,在輕量級鎖中奶镶,我們用到了自適應。自適應的理解陪拘,是建立在鎖的持有和釋放能夠很快完成厂镇,那么等待加鎖的線程根據(jù)獲取鎖的時間,來自己調(diào)整自旋的次數(shù)藻丢,這樣就避免了盲目等待剪撬,比如說摄乒,B線程發(fā)現(xiàn)A線程持有的鎖很快就被釋放了悠反,那么就讓自己多等待一會,否則就不等了
重量級鎖
不自旋馍佑,線程進入等待狀態(tài)
重量級鎖斋否,上面我們說到,重量級鎖很耗費性能拭荤,為什么茵臭?原因是拿不到鎖的線程,直接被park(掛起)舅世,然后放在等待隊列里旦委,等候被喚醒。所以這里就牽扯到了線程的切換雏亚,而線程的切換勢必會在操作系統(tǒng)層面缨硝,進行內(nèi)核和用戶態(tài)的切換,這種切換肯定是耗費性能的罢低。
一些問題查辩。胖笛。
自旋鎖一定比重量鎖效率高嗎?
不是宜岛,如果鎖的競爭度過高长踊,就是等待鎖的線程數(shù)量過多,或者臨界區(qū)(鎖住的代碼塊)的執(zhí)行時間過長萍倡,都不適合自旋身弊,大量的線程活躍占用cpu資源,這個時候適合重量級鎖列敲,讓線程等待
反之如果線程數(shù)量少佑刷,臨界區(qū)執(zhí)行時間短,適合自旋鎖自旋鎖什么時候升級為重量級鎖酿炸?
jdk1.6之前有兩種策略
1瘫絮、自旋超過10次
2、自旋線程數(shù)超過cpu核數(shù)的一半
jdk1.6之后加入了自適應自旋填硕,jvm優(yōu)化了自己控制偏向鎖打開是否一定會提示效率麦萤?為什么?
不一定扁眯,當業(yè)務場景明確一定會有多個線程來競爭鎖壮莹,這個時候沒必要打開偏向鎖,多個線程來競爭偏向鎖會有鎖撤銷的過程效率反而會降低
jvm啟動默認4秒之后打開偏向鎖