有一次线上发现,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 对象