clinit方法
程序员文章站
2022-07-11 18:52:31
...
- 当类有字段赋值操作或者静态代码块时,编译后会为这个类生成clinit方法来执行这些语句。
- clinit方法是被加锁的,同于一时刻只能有一个线程执行某个类的clinit方法。
static class A{
static{//clinit方法
if(true){
System.out.println(Thread.currentThread() + "init Class A");
while (true) {
}
}
}
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread()+" start");
A a = new A();
System.out.println(Thread.currentThread()+" finish");
}
};
//两个线程要加载同一个类
new Thread(runnable).start();
new Thread(runnable).start();
}
两个线程要都要新建A的实例,在类加载的时候,一个线程卡在了静态方法里的死循环中,另一个线程进不去clinit方法。
输出结果:
Thread[Thread-0,5,main] start
Thread[Thread-1,5,main] start
Thread[Thread-0,5,main]init Class A
上一篇: (简易)usb接口的程序设计
下一篇: iOS 屏幕横竖屏转换的方法