JAVA并發(fā)面試題

1,CAS的ABA問題

????獨(dú)占鎖:是一種悲觀鎖,synchronized就是一種獨(dú)占鎖,會導(dǎo)致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。

? ? ? 樂觀鎖:每次不加鎖,假設(shè)沒有沖突去完成某項(xiàng)操作,如果因?yàn)闆_突失敗就重試,直到成功為止。

? ? ?各種樂觀鎖的實(shí)現(xiàn)中通常都會用版本戳version來對記錄或?qū)ο髽?biāo)記,避免并發(fā)操作帶來的問題。


2,保留字volatile的意義及作用及原理

輕量級synchronized,保證共享變量的可見性;可見性是指,一個線程修改這個變量時,另一個線程可以讀到這個修改的值。

????在多處理器下,為保證各個處理器的緩存是一致的,需要實(shí)現(xiàn)緩存一致性協(xié)議:每個處理器通過嗅探在總線上傳播的數(shù)據(jù)來檢查自己緩存的值是不是過期了,當(dāng)發(fā)現(xiàn)自己的緩存行對應(yīng)的內(nèi)存地址被修改了,就會將當(dāng)前處理器的緩存行設(shè)置為無效行,當(dāng)需要對這個數(shù)據(jù)進(jìn)行操作的時候,會重新從內(nèi)存將數(shù)據(jù)讀取到緩存里面去。

volatile變量的第二個語義是禁止指令的重排序優(yōu)化,普通變量僅僅會保證在該方法的執(zhí)行過程中所有依賴賦值結(jié)果的地方都能獲取到正確的結(jié)果,而不能保證變量賦值操作的順序與代碼中的執(zhí)行順序一致。


3,synchronized和lock的區(qū)別

都具有線程的可重入性,只是代碼寫法上的不同,一個表現(xiàn)在API從層面的互斥鎖(lock(),unlock()方法配合try/finally語句塊來完成),另一個表現(xiàn)為原生語法上的互斥鎖。

? ? ?功能上考慮:? 相比synchronized,ReentrantLock增加了一些高級功能,主要有以下三項(xiàng):等待可中斷,公平鎖,鎖可以綁定多個條件。

? ? ?性能上考慮:JDK1.5,多線程環(huán)境下,synchronized吞吐量下降的非常嚴(yán)重,Reentrylock則基本保持在同一個比較穩(wěn)定的水平上。

JDK1.6發(fā)布后,synchronized與reentrylock的性能基本上是完全持平的,性能因素不在是選擇Reentrylock的理由,提倡使用synchronized。


4,鎖優(yōu)化

? ?適應(yīng)性自旋?

? ? 鎖消除

? ? 鎖粗化

? ? 輕量級鎖

? ? 偏向鎖

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

相關(guān)閱讀更多精彩內(nèi)容

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