欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

clinit方法

程序员文章站 2022-07-11 18:52:31
...
  1. 当类有字段赋值操作或者静态代码块时,编译后会为这个类生成clinit方法来执行这些语句。
  2. 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
相关标签: java 开发语言