Reentrantlock和synchronized是每個java開發(fā)的必修課,關于它們的資料十分豐富。但我經過搜索始終沒有找到對兩者進行系統對比的文章,這篇博客就因此應運而生了。
這里從頂至下對Reentrantlock和synchronized在實現上的異同進行了梳理,并沒有對具體設計使用上的區(qū)別多關注。各個層次的語言實現都是點到為止,沒有深入詳解(有些是因為比較簡單大家都知道,更多是比較底層我還不太清楚)。如果以后有時間我會對每個部分進行詳細的補充。
| 語言層次(從編寫到執(zhí)行的順序) | Reentrantlock | synchronized |
|---|---|---|
| Java代碼 | volatile & CAS(Reentrantlock由AbstractQueuedSynchronizer實現,而AQS則由volatile關鍵字和Unsafe這個類提供的CAS操作實現) | 無(本身就是關鍵字) |
| 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操作) |
刨除因為設計而產生的功能以及使用上的不同,Reentrantlock和synchronized最主要的區(qū)別在于Reentrantlock的主要實現在java代碼中而synchronized的主要實現在JVM中。
還可以看出Reentrantlock和synchronized在最底層都由Atomic::cmpxchg函數來完成,本質上都是由同一個底層實現的。而Atomic::cmpxchg函數在不同的平臺有不同的匯編實現。