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