1、synchronized同步關(guān)鍵字總述
jdk1.5之前 synchronized的同步依靠的是
系統(tǒng)內(nèi)核的互斥同步實(shí)現(xiàn)的。對(duì)于阻塞的實(shí)現(xiàn)需要在內(nèi)核中完成線程的掛起和恢復(fù)。嚴(yán)重影響了同步的并發(fā)性能
在jdk1.6實(shí)現(xiàn)了很多鎖優(yōu)化技術(shù)。如自旋鎖,鎖消除,鎖粗化,輕量鎖,和偏向鎖。
2、簡(jiǎn)述自旋鎖,鎖消除,鎖粗化,輕量鎖,和偏向鎖
(1)自旋鎖
原理其實(shí)就是一個(gè)忙循環(huán),循環(huán)等待。這種操作占用cpu時(shí)鐘,在長(zhǎng)時(shí)間阻塞中會(huì)影響計(jì)算機(jī)性能。所有jvm設(shè)置的是10個(gè)忙循環(huán)為獲得鎖會(huì)轉(zhuǎn)入重量鎖及互斥同步。忙循環(huán)次數(shù)可以自己用指令設(shè)置-XX:PreBlockSpin
(2)鎖消除
鎖消除jvm編譯時(shí),判斷有些代碼不需要同步的會(huì)自動(dòng)去掉同步鎖,以免造成浪費(fèi)
(3)鎖粗化
鎖粗化 在一個(gè)循環(huán)內(nèi)加鎖循環(huán)加鎖,jvm編譯時(shí)能夠?qū)㈡i已到循環(huán)外避免鎖重復(fù)
(4)輕量鎖
輕量鎖在沒有并發(fā)競(jìng)爭(zhēng)的時(shí)候使用,獲取鎖時(shí)將對(duì)象頭部的鎖標(biāo)識(shí)設(shè)置為已鎖定。如果有鎖來(lái)競(jìng)爭(zhēng),先使用自旋鎖等待。若在一定次數(shù)內(nèi)未獲得相關(guān)鎖,在轉(zhuǎn)入重量鎖。盡可能的避免互斥鎖的使用,影響并發(fā)性能
(5)偏向鎖
第一次獲取鎖對(duì)象頭設(shè)置為偏向鎖狀態(tài),存入線程id。在無(wú)競(jìng)爭(zhēng)情況下,后續(xù)進(jìn)入該線程無(wú)需任何操作。在有線程來(lái)競(jìng)爭(zhēng)時(shí),取消偏向鎖狀態(tài)后續(xù)操作和輕量鎖類似