定義Logger為什么要用static和final?為什么不用getClass()?


有一次線上發現,redis連接很慢,最后同事說,有個原因就是getClass()

private final Logger logger = LoggerFactory.getLogger(getClass());

 

因為這不是一個靜態常量,在序列化這個變量的時候,有的序列化方法並不好用,里邊有一個class.forName()方法,是個阻塞性的,導致了高並發多線程的時候,序列化很慢

進而redis很慢。(好像和redis沒什么關系汗)

 


 

以下轉自:https://www.cnblogs.com/jxd283465/p/11726678.html

private static final Logger logger= LoggerFactory.getLogger(ShiroConfig.class);

 

(1)出於資源利用的考慮,Logger的構造方法參數是Class,決定了Logger是根據類的結構來進行區分日志,所以一個類只要一個Logger就可以了,故static

(2)final表示一種編程習慣,表示該類的Logger只是記錄該類的信息,否則日志會無法提供可以令人信服的記錄

  • 定義成static final,logger變量不可變,讀取速度快
  • static 修飾的變量是不管創建了new了多少個實例,也只創建一次,節省空間,如果每次都創建Logger的話比較浪費內存;final修飾表示不可更改,常量
  • 將域定義為static,每個類中只有一個這樣的域.而每一個對象對於所有的實例域卻都有自己的一份拷貝.,用static修飾既節約空間,效率也好。final 是本 logger 不能再指向其他 Logger 對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM