⑤ 接口中不能使用静态语句块,但仍然有变量初始化的赋值操作,因此接口与类一样都会生成『<clinit>()』方法。但接口与类不同的是,执行接口的『<clinit>()』方法不需要先执行父接口的『<clinit>()』方法。只有当父接口中定义的变量使用时,父接口才会初始化。另外,接口的实现类在初始化时也一样不会执行接口的『<clinit>()』方法。
“接口的初始化”与“类的初始化”的区别:当一个类在初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求父接口全部都完成了初始化,只有在真正使用到父接口的时候才会初始化。
(注意,这里是“父类全部”而不是“全部父类”。因为Java是单继承的,每个Java类只会有一个父类,而父类又可以有它的父类。。。而且每一个父类(即,这个类)只会被初始化一次。)
PS:可以根据HSDIS生成的汇编结果查看是否有调用『<clinit>()』
⑥ 虚拟机会保证一个类的『<clinit>()』方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的『<clinit>()』方法,其他线程都需要阻塞等待,直到活动线程执行『<clinit>()』方法完毕。如果在一个类的『<clinit>()』方法中有耗时很长的操作,就可能造成多个进程阻塞(其他线程虽然会被阻塞,但如果执行『<clinit>()』方法的那条线程退出『<clinit>()』方法后,其他线程唤醒之后不会再次进入『<clinit>()』方法。同一个类加载器下,一个类型只会初始化一次),在实际应用中这种阻塞往往是很隐蔽的。
如果文章有错不吝指教 :)
《深入理解Java虚拟机》
圣思园《深入理解JVM》
热门标签:,塞韦里娜,蔷靖潞影洛阳新闻,乐伽数卡,呛辣女佣爱生气,狐狸相公好诱人,春厢秘史之鸾凤倒,小依山狗,脱了裤子换馒头,纳粹少女的春天,旭东背影家园,四平风采测网速,chengrendiantai
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-80669-8.html
吃大便也会说成比饭好吃