虚拟机必须保证一个类的()方法在多线程下被同步加锁。
代码
public class DeadThreadTest {
public static void main(String[] args) {
Runnable r = () -> {
System.out.println(Thread.currentThread().getName() + "开始");
DeadThread dead = new DeadThread();
System.out.println(Thread.currentThread().getName() + "结束");
};
Thread t1 = new Thread(r,"线程1");
Thread t2 = new Thread(r,"线程2");
t1.start();
t2.start();
}
}
class DeadThread{
static{
if(true){
System.out.println(Thread.currentThread().getName() + "初始化当前类");
while(true){
}
}
}
}
结果
线程1开始
线程1初始化当前类
线程2开始
分析
如果clinit 方法没有同步锁的话,理论上两个线程会都执行静态代码块,但是实际上是有锁的一个线程加载没有出来其他的线程都会堵塞
总结
静态自动加锁理论