1. 程式人生 > 實用技巧 >Netty學習05- Netty對鎖的使用優化和對記憶體的使用優化

Netty學習05- Netty對鎖的使用優化和對記憶體的使用優化

學習第18-20節

同步問題的核心三要素:原子性、可見性、有序性
鎖的分類:
樂觀鎖(java.util.concurrent 包中的原子類)與悲觀鎖(Synchronized)
公平鎖 new ReentrantLock (true)與非公平鎖 new ReentrantLock ()
共享鎖與獨享鎖:ReadWriteLock ,其讀鎖是共享鎖,其寫鎖是獨享鎖

Netty從以下幾個方面優化鎖的使用:

Netty減少鎖的物件和範圍,減少鎖的粒度(比如把Synchronized加到程式碼塊而不是方法上)。
Netty減少鎖物件本身的大小,減少空間佔用(比如自住實現volatile的long而不是AtomicLong)。

Netty提供鎖的速度,提高並行性。(比如根據jdk版本區分使用的類)。
Netty根據不同場景選擇不同的併發包,因需而變。
Netty很好的衡量好鎖的價值,能不用則不用鎖(區域性序列 + 整體並行 > 一個佇列 + 多個執行緒模式),這樣的好處是:
(1)降低使用者開發難度、邏輯簡單、提升處理效能
(2)避免鎖帶來的上下文切換和併發保護等額外開銷
Netty避免用鎖:用 ThreadLocal 來避免資源爭用,例如 Netty 輕量級的執行緒池實現io.netty.util.Recycler#threadLocal
在這裡插入圖片描述

Netty從以下幾個方面優化對記憶體的使用:

1、減少對像本身大小:儘量定義類變數而非例項變數,

2、對分配記憶體進行預估:預知固定size避免HashMap擴容
3、Zero-Copy:使用邏輯組合、包裝以及JDK的zero-copy介面,代替實際複製
4、使用堆外記憶體(堆heap,非堆non heap,堆外off heap)
5、使用記憶體池(引入物件池,開源實現Apache Commons Pool,Netty自實現輕量級記憶體池)

Netty中切換堆內外記憶體的方法
在這裡插入圖片描述
Netty中切換記憶體池的方法
在這裡插入圖片描述
注:內容參考極客時間相關課程