记一次类加载引起的Bug
1.起因
程序莫名其妙出了
error:java.lang.NullPointerException: Null reference used for synchronization (monitor-enter)
就是在使用同步锁的时候,是锁的对象是空的。很是奇怪,看代码没觉得啊。打印一下,确实是空的,Why?
程序莫名其妙出了
error:java.lang.NullPointerException: Null reference used for synchronization (monitor-enter)
就是在使用同步锁的时候,是锁的对象是空的。很是奇怪,看代码没觉得啊。打印一下,确实是空的,Why?
本次我们主要讨论子类和父类的类加载器之前的关系, 以及包含之前的类加载器关系。
我们自定义一个classloder,设置父加载器为null,这样保证都是自己来加载,指向的路径和AppClassloader一致,这样方便2个都好直接加载
下面的代码会不会导致Student类的加载与初始化?
1 | public class ClassLoadTest { |
当然你可以说通过JOL查看对象的头信息,当然那个也是一种方法,但那个只能说明是这种状态,没有过程,本次主要结合来验证,Synchronized 关键字锁的状态:无锁、偏向锁、轻量级锁、重量级锁
基于Ubuntu16测试成功。18测试失败,centos没有测试
主要是在Java调用系统函数的时候,打印log。但是在Java里面打印线程ID是JVM层面的。需要自己实现一个native方法,在java层面调用。最后对比对应的PID 和TID,发现查看当前线程调用了几次系统锁
Java 的重量级级锁都是通过glibc库的pthread_mutex_lock函数实现的,是在和操作系统级别的锁。