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)性自旋?
? ? 鎖消除
? ? 鎖粗化
? ? 輕量級鎖
? ? 偏向鎖