Java核心知識 多線程併發 鎖優化(十九)

Java核心知識 多線程併發 鎖優化(十九)

減少鎖持有時間

只用在有線程安全要求的程序上加鎖

減小鎖粒度

將大對象(這個對象可能會被很多線程訪問),拆成小對象,大大增加並行度,降低鎖競爭。 降低了鎖的競爭,偏向鎖,輕量級鎖成功率才會提高。最最典型的減小鎖粒度的案例就是 ConcurrentHashMap。

鎖分離

最常見的鎖分離就是讀寫鎖 ReadWriteLock,根據功能進行分離成讀鎖和寫鎖,這樣讀讀不互 斥,讀寫互斥,寫寫互斥,即保證了線程安全,又提高了性能,具體也請查看[高併發 Java 五] JDK 併發包 1。讀寫分離思想可以延伸,只要操作互不影響,鎖就可以分離。比如 LinkedBlockingQueue 從頭部取出,從尾部放數據

鎖粗化

通常情況下,為了保證多線程間的有效併發,會要求每個線程持有鎖的時間儘量短,即在使用完 公共資源後,應該立即釋放鎖。但是,凡事都有一個度,如果對同一個鎖不停的進行請求、同步 和釋放,其本身也會消耗系統寶貴的資源,反而不利於性能的優化 。

鎖消除

鎖消除是在編譯器級別的事情。在即時編譯器時,如果發現不可能被共享的對象,則可以消除這 些對象的鎖操作,多數是因為程序員編碼不規範引起。


分享到:


相關文章: