java初始化一个类的处理过程
-
第一阶段
通过在Class对象上同步(即获取class对象上的锁),来控制类或者接口的初始化,这个获取锁的线程会一直等待,知道当前线程获取到这个初始化锁。
假设Class对象当前没有被初始化,(初始状态为state,标记state =noInitialzation),且有两个线程AB同时试图初始化这个对象 -
第二阶段线程A执行类的初始化,同时B在初始化锁的condition上等待
- 第三阶段,A设置state=initialized,然后唤醒在condition中等待的所有线程
-
B结束类的初始化处理
T1:B获取初始化锁
T2:读取到state =initialized
T3:B释放初始化锁
T4:B的类初始化完成
线程A在第二阶段完成类的初始化,在第三阶段释放初始化锁。线程B在第四阶段获取同一个初始化锁,并在第四阶段B4之后开始访问这个类。根据JMM的锁规则,存在如下happens-before关系:
线程A执行类的初始化时的写操作,线程B一定能看到