爲什麼JDK1.8中放棄了分段鎖

       在網上找了很多參考文章,講解的都只是一知半解,看完以後都想放棄了,但還是想把這個問題搞清楚,所以多參考了幾篇博客,然後看了一下源代碼,最終理解了一點。

        其實一切的優化和升級都是圍繞時間和空間來進行的,jdk1.8中放棄分段鎖,改用cas、synchronize、volatile。分段鎖,其實讓鎖的粒度變大了,本來每個鏈表上發生衝突的可能性很小,現在把幾個鏈表聚合在一起,顯然增加了獲取鎖的衝突,所以時間上消耗更多。同時,之前使用ReenTrantLock需要每個segment都繼承ReenTrantLock,顯然增加了內存的開銷。升級之後,在時間和空間上都進行了一定的優化。

       另外,cas是unsfale的一類方法,通過這些方法可以實現cpu級別的原子操作,保證數據多個線程之間數據的一致性。ReenTrantLokc是基於AQS框架來實現的,AQS又是基於CAS和隊列來實現的。底層其實都是用的unsafe提供的方法。

       unsafe除了提供cas系列操作之外,還提供了對外內存的操作。對堆外內存的操作,提高了內存操作的效率。這其實相當於零拷貝,在linux系統裏面,進行內存操作,會有一個從內核態到用戶態的內存拷貝,內核態到用戶態的拷貝是比較耗時的,如果只是短暫的使用一下內存數據,其實沒必要複製到堆內存中,可以直接操作對外內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章