面試必備之Synchronized關(guān)鍵字

談?wù)勀銓ynchronized的理解

1.synchronized 關(guān)鍵字解決的是多個(gè)線程之間訪問資源的同步性。在java1.6之前,synchronized是屬于重量級鎖,效率比較低。synchronized在JVM里的實(shí)現(xiàn)是基于進(jìn)入和退出Monitor對象來實(shí)現(xiàn)同步的。而監(jiān)視器鎖(Monitor)是依賴于底層的操作系統(tǒng)的Mutex Lock 來實(shí)現(xiàn)的.

2.如果要掛起或者喚醒一個(gè)線程,都需要操作系統(tǒng)幫忙完成,而操作系統(tǒng)實(shí)現(xiàn)線程之間的切換時(shí)需要從用戶態(tài)轉(zhuǎn)換到內(nèi)核態(tài),這個(gè)狀態(tài)之間
的轉(zhuǎn)換需要相對比較長的時(shí)間,時(shí)間成本相對較高.

3.而在java1.6之后,官方為了減少鎖操作的開銷,引入了偏向鎖、輕量級鎖,自旋鎖,自適應(yīng)自旋鎖以及鎖的存儲(chǔ)結(jié)構(gòu)和升級過程。有些情況就不那么重了(ps:相關(guān)鎖的適用場景)

說說自己怎么使用synchronized關(guān)鍵字,在項(xiàng)目中用到了嗎?

1.對于普通同步方法,鎖是當(dāng)前實(shí)例對象

2.對于靜態(tài)同步方法,鎖是當(dāng)前類的Class對象

3.對于同步方法快,鎖是synchronized括號(hào)里配置的對象。

說說JDK1.6后的synchronized關(guān)鍵字底層做了哪些優(yōu)化

1.在Java SE 1.6中,鎖一共有4種狀態(tài),依次是:無鎖狀態(tài)、偏向鎖狀態(tài)、輕量級鎖狀態(tài)和重量級鎖狀態(tài),它們會(huì)隨著競爭情況而逐漸升級。注意鎖可以升級不可降級,這種策略是為了提高獲得鎖和釋放鎖的效率。

鎖相關(guān)概念

1.偏向鎖:當(dāng)一個(gè)線程訪問同步塊并獲取鎖時(shí),會(huì)在對象頭和棧幀中的鎖記錄里存儲(chǔ)鎖偏向的線程ID,以后該線程在進(jìn)入和退出同步塊時(shí)不需要進(jìn)行CAS操作來加鎖和解鎖。

2.輕量級鎖:減少無實(shí)際競爭下,使用重量級鎖產(chǎn)生的消耗。

3.重量級鎖:線程阻塞,響應(yīng)時(shí)間緩慢。

Mark Word的存儲(chǔ)結(jié)構(gòu)

image


鎖的優(yōu)缺點(diǎn)對比

image

鎖的升級過程

1.一個(gè)對象剛開始實(shí)例化的時(shí)候,沒有任何線程來訪問它的時(shí)候。它是可偏向的,偏向鎖標(biāo)志位為1,當(dāng)?shù)谝粋€(gè)線程來訪問它的時(shí)候,它會(huì)偏向這個(gè)線程,并使用CAS將對象頭的ThreadID改成自己的ID,之后再次訪問這個(gè)對象時(shí),只需對比ThreadID,不需要再使用CAS在進(jìn)行操作。

2.一旦有第二個(gè)線程訪問這個(gè)對象,因?yàn)槠蜴i不會(huì)主動(dòng)釋放,它使用了一種等到競爭出現(xiàn)才釋放鎖的機(jī)制。所以第二個(gè)線程可以看到對象是偏向狀態(tài),它會(huì)首先暫停擁有偏向鎖的線程,然后檢查持有偏向鎖的線程是否存活,如果掛了,則將對象頭設(shè)置成無鎖狀態(tài),然后重新偏向新的線程。如果原來的線程依然存活,則馬上執(zhí)行那個(gè)線程的操作棧,檢查該對象的使用情況,如果仍然需要持有偏向鎖,則偏向鎖升級為輕量級鎖(偏向鎖就是這個(gè)時(shí)候升級為輕量級鎖的)此時(shí)輕量級鎖由原持有偏向鎖的線程持有,繼續(xù)執(zhí)行其同步代碼,而正在競爭的線程會(huì)進(jìn)入自旋等待獲得該輕量級鎖;如果不存在使用了,則可以將對象回復(fù)成無鎖狀態(tài),然后重新偏向。

3.輕量級鎖認(rèn)為競爭存在,但是競爭的程度很輕,一般兩個(gè)線程對于同一個(gè)鎖的操作都會(huì)錯(cuò)開,或者說稍微等待一下(自旋),另一個(gè)線程就會(huì)釋放鎖。 但是當(dāng)自旋超過一定的次數(shù),或者一個(gè)線程在持有鎖,一個(gè)在自旋,又有第三個(gè)來訪時(shí),輕量級鎖膨脹為重量級鎖,重量級鎖使除了擁有鎖的線程以外的線程都阻塞,防止CPU空轉(zhuǎn)。

談?wù)剆ynchronized和ReentrantLock的區(qū)別

①兩者都是可重入鎖

②synchronized依賴于JVM而ReentrantLock是JDK層面實(shí)現(xiàn)的

③ReentrantLock比synchronized增加了一些高級功能:1.等待可中斷2.可實(shí)現(xiàn)公平鎖3.可實(shí)現(xiàn)選擇性通知

補(bǔ)充點(diǎn):CPU的內(nèi)核態(tài)和用戶態(tài)

內(nèi)核態(tài)
1.系統(tǒng)中既有操作系統(tǒng)的程序,也有普通用戶程序。為了安全性和穩(wěn)定性,操作系統(tǒng)的程序不能隨便訪問,這就是內(nèi)核態(tài)。即需要執(zhí)行操作系統(tǒng)的程序就必須轉(zhuǎn)換到內(nèi)核態(tài)才能執(zhí)行!??!

2. 內(nèi)核態(tài)可以使用計(jì)算機(jī)所有的硬件資源!?。?br>
用戶態(tài):不能直接使用系統(tǒng)資源,也不能改變CPU的工作狀態(tài),并且只能訪問這個(gè)用戶程序自己的存儲(chǔ)空間?。。?!

參考

1.不能逃避的synchronized關(guān)鍵字

2.《java并發(fā)編程的藝術(shù)》

3java并發(fā)筆記synchronized鎖的升級過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容