基於《深刻理解java虛擬機》類加載過程整理java
注意:加載一個類時,其內部類不會同時被加載。一個類被加載,當且僅當其某個靜態成員(靜態域、構造器、靜態方法等)被調用時發生。 數據結構
動態加載?spa
類加載器線程
1 啓動類加載器(Bootstrap ClassLoader):有C++語言實現,負責加載AVA_HOME/lib文件夾的類,或者被Xbootclasspath參數指定的路徑中的類指針
2 擴展類加載器(Extension ClassLoader),java語言實現,負責加載JAVA_HOME/lib/ext文件夾下的類對象
3 應用程序加載器(Application ClassLoader):sun.misc.Launcher$AppClassLoader,負責加載classpath路徑的類繼承
雙親委派模型接口
雙親委派模型是每一個類加載器(除了頂級加載器--啓動類加載器)收到類的加載請求,首先不是本身去查找加載該類,而是委派給父類,每一層的類加載器都是如此,知道頂級類加載器,只有當頂級類加載器反饋本身也找不到該類,子類才嘗試本身加載該類內存
內存模型同步
分主內存和線程的工做內存
1 線程先從內存複製一份變量的副本,而後變量的寫操做在線程的工做內存中完成,當線程執行完畢則將內存中變量副本的值更新下到主內存中
注意:線程與線程是互相獨立,線程不能直接訪問其餘線程工做內存的變量
volatile是保證內存的可見性在於兩點
①線程每次使用該變量前都是去主內存刷新一次
② 線程每次修改變量,都會當即同步到主內存