java是多线程的,所以类或者接口的初始化要求仔细的同步,因为同时某个别的线程可能正在试图初始化同一个类或者接口,也有可能作为类或者接口初始化的一部分,要求递归地初始化该类或接口。
要了解类的初始化过程,首先要知道Class对象的状态,class对象的状态有以下几种:
1、被检验和准备,但是没有被初始化;
2、正在被某个特殊的线程T初始化;
3、被完整地初始化并且可以使用;
4、处于错误状态,可能由于检验或者准备失败,或者由于试图初始化且失败了。
初始化的过程如下:
1、同步代表类或接口的class对象的初始化,包括一直等待到当前线程可以获得那个对象的锁;
2、如果某个别的线程正在初始化这个类或接口,则对这个class对象wait,当前线程醒来时,重复这一步骤;
3、如果当前线程正在对类或者接口初始化,则这一定是初始化的一个递归要求,释放class对象上的锁并正常地结束;
4、如果类或接口已被初始化,则不再需要进一步动作,释放class对象上的锁并正常地结束;
5、如果对象处于错误状态,则不可能初始化,释放class对象上的锁并抛出NoClassDefFoundError;
6、否则,记录对象正在被当前线程初始化的事实,并释放class对象上的锁;
7、接着,如果对象代表一个类而非接口并且该类的超类尚未被初始化,则对超类递归地执行这一过程,如果需要,首先检验并准备这个超类,如果因一个抛出的异常E使用超类初始化突然结束,则锁定这个class对象,把它标为错误的,通知所有正在等待的线程,释放锁,并且突然结束,抛出与初始化该超类所引起的相同的异常;
8、接着,除了final static变量和接口的其值为编译期常数的域首先初始化外,按文本顺序执行类变量的初始化器和类的静态初始化函数,或者接口的域初始化器,就好象它们是一个单个的块;
9、如果初始化函数的执行正常地结束,则锁定这个class对象,把它标为被完整地初始化,通知所有正在等待的线程,释放锁并正常地结束该过程;
10、否则,初始化函数一定是通过抛出某个异常E突然结束,如果E的类不是Error或其子类之一,则用E作为参数创建类ExceptionInInitializerError的一个新实例,并在以后的步骤中用这个对象代替E,但是如果因发生一个OutOfMemoryError而不能创建ExceptionInInitailizerError的新实例,则在以后步骤中用一个OutOfMemoryError对象代替E;
11、锁定这个class对象,把它标为错误的,通知所有正在等待的线程,释放锁,并且带着原因E或者在前面步骤中确定的E的替换突然结束结束这个过程。
分享到:
相关推荐
java 数组初始化 详解 doc
对java类初始化以及顺序,详解,由于转载仅供大家参考!
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器
本篇文章主要介绍了Spring 中如何控制2个bean中的初始化顺序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了Java中初始化块详解及实例代码的相关资料,在Java中,有两种初始化块:静态初始化块和非静态初始化块,需要的朋友可以参考下
主要介绍了java对象初始化代码详解,涉及实例变量的初始化,类变量的初始化等相关介绍几代码示例,具有一定参考价值,需要的朋友可以了解下。
主要介绍了Java类继承关系中的初始化顺序,结合实例形式详细对比分析了Java非继承关系中的初始化与继承关系中的初始化相关原理与操作技巧,需要的朋友可以参考下
网上有很多关于Java中class的初始化顺序文章,但是本文通过图文更加详细的介绍了Java中class的初始化顺序,并对class的装载顺序进行了讲解,下面一起来看看。
16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”) 16.3.6 迫切左外连接检索(fetch属性为“join”) 16.4 多对一和一对一关联的检索策略 16.4.1 迫切左外连接检索(fetch...
Calendar 和 Date 类 是JAVA很重要的两个类,学好它们对于JAVA学习的道路非常重要
本篇文章是对Java变量的初始化顺序进行了详细的分析介绍,需要的朋友参考下
本篇文章介绍了,Java对象初始化顺序的使用。需要的朋友参考下
主要介绍了 本文主要讲数组的初始化方法、可变参数列表以及可变参数列表对函数重载的影响的相关资料,需要的朋友可以参考下
本篇文章主要介绍了JavaWeb中web.xml初始化加载顺序详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在本文中小编给大家整理了关于java数组的初始化及操作的相关知识点内容,需要的读者们参考下。
主要介绍了Java的初始化与清理,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”) 16.3.6 迫切左外连接检索(fetch属性为“join”) 16.4 多对一和一对一关联的检索策略 16.4.1 迫切左外连接检索(fetch...
16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”) 16.3.6 迫切左外连接检索(fetch属性为“join”) 16.4 多对一和一对一关联的检索策略 16.4.1 迫切左外连接检索(fetch...
关于如何生成进度条的一些demo 当一个应用程序启动需要较长时间时...启动界面Splash Window,在应用程序初始化完成后该画面自动消失,在等待的 这段时间里用户可通过欣赏画面来打磨时间。 java中如何实现进度条的效果