ConcurrentHashMap(JDK1.8)為什么要使用synchronized而不是如ReentranLock這樣的可重入鎖?
1. 減少內(nèi)存開銷
假設(shè)使用可重入鎖來獲得同步支持,那么每個(gè)節(jié)點(diǎn)都需要通過繼承AQS來獲得同步支持。但并不是每個(gè)節(jié)點(diǎn)都需要獲得同步支持的,只有鏈表的頭節(jié)點(diǎn)(紅黑樹的根節(jié)點(diǎn))需要同步,這無疑帶來了巨大內(nèi)存浪費(fèi)。
2. 獲得JVM的支持
可重入鎖畢竟是API這個(gè)級別的,后續(xù)的性能優(yōu)化空間很小。
synchronized則是JVM直接支持的,JVM能夠在運(yùn)行時(shí)作出相應(yīng)的優(yōu)化措施:鎖粗化、鎖消除、鎖自旋等等。這就使得synchronized能夠隨著JDK版本的升級而不改動(dòng)代碼的前提下獲得性能上的提升。