2012-07-17 47 views
2

在我读了JLS section 12.4.2之后。类和接口的初始化

2.如果对于C类对象指示初始化正在进行对于C通过一些其它线程,然后松开LC并阻止当前线程,直到得知正在进行初始化已完成,在该时间重复这一步。

当前线程是否真的需要释放由其他线程获取的LC?这个动作安全吗?类或接口的初始化会在应用程序中发生多少次?谢谢。

回答

4

JVM的合同是该类已完成加载之前允许任何应用程序线程使用该类。 “完成加载”意味着所有的静态初始化已经完成(即所有的静态块已经执行并且静态字段按照它们被编码的顺序被初始化)

当第一次使用时加载类,所以无论发生在隐式地)调用ClassLoader来加载类,并在ClassLoader完成加载类时阻塞(如上所述)。当类正在加载时,碰巧使用类的任何其他线程也将阻止等待类完成加载。

类为每个JVM启动加载一次。


对侍者的提示:是的,可以使用ClassLoader功夫来重新加载一个类,但是这种解释并没有误导。

+0

翔实的答案! +1 – Jasonw 2012-07-17 07:05:46