欢迎访问我的个人网站==》 jiashubing.cn

定义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 对象

 

posted @ 2020-08-03 18:26  贾树丙  阅读(1370)  评论(0编辑  收藏  举报