加载:
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { ...... return c; } }
查看getClassLoadingLock的具体实现可以发现:
1)对于同一个classloader来说,加载某个class文件为Class对象时。为保证class文件只会被加载一次,所以每种class文件都会有一个锁。一般来说
protected Object getClassLoadingLock(String className) { Object lock = this; if (parallelLockMap != null) { Object newLock = new Object(); lock = parallelLockMap.putIfAbsent(className, newLock); if (lock == null) { lock = newLock; } } return lock; }
初始化:
初始化阶段其实就是执行static{}块,顺序是先父类,再子类。这个阶段如果有多个线程同时执行static{},那么会被正确的加锁,排队。而且会保证,static{}只会被执行一次,同一个classloader下,一个类只会初始化一次。
所以呢,这里注意一下,如果static{}块中需要阻塞等待,那是有可能导致多个线程阻塞。