Reentrantlock和synchronized是每個java開發(fā)的必修課,關(guān)于它們的資料十分豐富履腋。但我經(jīng)過搜索始終沒有找到對兩者進行系統(tǒng)對比的文章,這篇博客就因此應(yīng)運而生了危彩。
這里從頂至下對Reentrantlock和synchronized在實現(xiàn)上的異同進行了梳理徒欣,并沒有對具體設(shè)計使用上的區(qū)別多關(guān)注逐样。各個層次的語言實現(xiàn)都是點到為止,沒有深入詳解(有些是因為比較簡單大家都知道帚称,更多是比較底層我還不太清楚)官研。如果以后有時間我會對每個部分進行詳細的補充。
語言層次(從編寫到執(zhí)行的順序) | Reentrantlock | synchronized |
---|---|---|
Java代碼 | volatile & CAS(Reentrantlock由AbstractQueuedSynchronizer實現(xiàn)闯睹,而AQS則由volatile關(guān)鍵字和Unsafe這個類提供的CAS操作實現(xiàn)) | 無(本身就是關(guān)鍵字) |
JVM字節(jié)碼 | volatile:變量修飾符ACC_VOLATILE;CAS:無(直接引用的本地方法) | synchronized同步方法:方法修飾符ACC_SYNCHRONIZED担神;synchronized同步代碼塊:指令monitorenter 和 monitorexit |
c語言/匯編語言(解釋字節(jié)碼) | volatile:bytecodeInterpreter.cpp(有使用c語言中的volatile楼吃,看不太懂);CAS:unsafe.cpp(通過Atomic::cmpxchg_ptr進行CAS操作) | synchronizer.cpp(通過Atomic::cmpxchg_ptr進行CAS操作) |
刨除因為設(shè)計而產(chǎn)生的功能以及使用上的不同,Reentrantlock和synchronized最主要的區(qū)別在于Reentrantlock的主要實現(xiàn)在java代碼中而synchronized的主要實現(xiàn)在JVM中孩锡。
還可以看出Reentrantlock和synchronized在最底層都由Atomic::cmpxchg函數(shù)來完成酷宵,本質(zhì)上都是由同一個底層實現(xiàn)的。而Atomic::cmpxchg函數(shù)在不同的平臺有不同的匯編實現(xiàn)躬窜。