java之类的初始化详细过程

(1)每个类都有一个初始化锁LC,线程获取LC,这个操作会导致当前线程一直等待,直到获取到LC锁。

(2)如果C正在被其他线程初始化,当前线程会释放LC锁进入阻塞状态,并等待C初始化完成。此时当前线程需要重试这一个过程。执行初始化的过程时,线程的中断状态不受影响。

(3)如果C正在被本线程初始化,即递归初始化,释放LC并且正常返回。

(4)如果C已经初始化完成,释放LC并且正常返回。

(5)如果C处于错误状态,表明不可能再完成初始化,释放LC并抛出异常NoClassFoundError异常。

(6)否则,将C标记为正在被本线程初始化,释放LC;然后,初始化哪些final且为基础类型的类成员变量。

(7)如果C是类而不是接口,且C的父类Supper Class和哥哥接口还没有初始化,那么就在SC上面递归的进行完整的初始化过程,如果有必要,需要先验证和准备SC;

如果SC或初始化过程中抛出异常,则获取LC,将C标记为错误状态,并通知所有正在等待的线程,然后释放LC,然后再抛出同样的异常。

(8)从C的classloader处获取assertion断言机制是否被打开。

(9)接下来,按照文本顺序执行类变量初始化和静态代码块,或接口的字段初始化,把它们当作是一个个单独的代码块。

(10)如果执行正常,那就获取LC,标记C对象为已初始化,并通知所有正在等待的线程,然后释放LC,正常退出整个过程。

(11)否则,如果抛出了异常E那么会中断退出,如果E不是Error,则以E为参数创建新的异常。

(12)获取LC,将C标记为错误状态,通知所有等待的线程,释放LC,并抛出异常E。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值