java初始化類

初始化(Initialization)對於類或接口來說,就是執行它的初始化方法(§2.9)。在發 生下列行爲時,類或接口將會被初始化: 在執行下列需要引用類或接口的Java虛擬機指令時:new,getstatic,putstatic 或 invokestatic。這些指令通過字段或方法引用來直接或間接地引用其它類。執行上 面所述的 new 指令,在類或接口沒有被初始化過時就初始化它。執行上面的 getstatic, putstatic 或 invokestatic 指令時,那些解析好的字段或方法中的類或接口如果還 沒有被初始化那就初始化它。  在初次調用java.lang.invoke.MethodHandle實例時,它的執行結果爲通過Java 虛擬機解析出類型是 2(REF_getStatic)、4(REF_putStatic)或者 6 (REF_invokeStatic)的方法句柄(§5.4.3.5)。  在調用JDK核心類庫中的反射方法時,例如,Class類或java.lang.reflect包。 在對於類的某個子類的初始化時。  在它被選定爲Java虛擬機啓動時的初始類(§5.2)時。 在類或接口被初始化之前,它必須被鏈接過,也就是經過驗證、準備階段,且有可能已經被解析完成了。
因爲 Java 虛擬機是支持多線程的,所以在初始化類或接口的時候要特別注意線程同步問題, 可能其它一些線程也想要初始化相同名稱的類或接口。也有可能在初始化一些類或接口時,初始的 請求被遞歸要求初始化它自己。Java 虛擬機實現需要負責處理好線程同步和遞歸初始化,具體可 以使用下面的步驟來處理。這些處理步驟假定 Class 對象已經被驗證和準備過,並且處於下面所 述的四種狀態之一: Class對象已經被驗證和準備過,但還沒有被初始化。
Class對象正在被其它特定線程初始化。
Class對象已經成功被初始化且可以使用。
Class對象處於錯誤的狀態,可能因爲嘗試初始化時失敗過
每個類或接口 C,都有一個唯一的初始化鎖 LC。如何實現從 C 到 LC 的映射可由 Java 虛擬機實現自行決定。例如,LC 可以是 C 的 Class 對象,或者是與 Class 對象相關的管程(Monitor)。 初始化 C 的過程如下: 同步C的初始化鎖LC。這個操作會導致當前線程一直等待直到可以獲得LC鎖。 如果C的Class對象顯示當前C的初始化是由其它線程正在進行,那麼當前線程釋放 LC 並進入阻塞狀態,直到它知道初始化工作已經由其它線程完成,那麼當前線程在此重試此步驟。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章