加载 - 链接 - 初始化 中的锁

    

加载:

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{}块中需要阻塞等待,那是有可能导致多个线程阻塞。



猜你喜欢

转载自blog.csdn.net/u011385186/article/details/79055461