java初始化一个类的处理过程

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