2017-10-10 1 views
1

Java 클래스는 클래스가 먼저로드 될 때 하나의 JVM에 한 번만 초기화됩니다. 그리고 하나 이상의 스레드가 같은 클래스를 동시에로드하려고 할 수 있다고 생각합니다. JVM이 어떻게이 문제를 처리합니까? 잠금 장치와 같은 문제를 방지 할 수있는 메커니즘이 있습니까?Jave는 동시 클래스 초기화가 어떻게 일어나지 않도록합니까?

+0

'자바 클래스는 한 번만마다 초기화된다 하나의 jvm' - 그것은 사실이 아닙니다. 올바른 문장은''자바 클래스는 클래스 로더 당 한 번만 초기화됩니다' – rkosegi

+1

http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.2 –

답변

4

먼저 다음 문장은 정확하지 않다 :

자바 클래스는 한 번만 하나의 JVM마다 초기화된다

자바 클래스는 클래스 로더에 한 번 초기화됩니다. JVM 인스턴스는 여러 클래스 로더를 가질 수 있으며 각 클래스 로더는 동일한 클래스를 개별적으로로드합니다.

질문에 대답하려면 - 예, 클래스 로더는 클래스를로드하는 동안 잠금을 가져와야합니다. 예를 들면, 당신은 (댓글 잠금을 강조하기 위해 추가) 결국 다음과 같은 방법으로 아래로 비등하는 클래스를로드, java.lang.ClassLoader의 오픈 JDK (9)의 구현을 살펴 :

final Class<?> loadClass(Module module, String name) { 
    synchronized (getClassLoadingLock(name)) { // Note the locking here! 
     // First, check if the class has already been loaded 
     Class<?> c = findLoadedClass(name); 
     if (c == null) { 
      c = findClass(module.getName(), name); 
     } 
     if (c != null && c.getModule() == module) { 
      return c; 
     } else { 
      return null; 
     } 
    } 
} 
+1

JVM의 관점에서 볼 때, "동일한 클래스를 개별적으로로드하는 여러 클래스 로더"는 동일한 이름 또는 동일한 바이트 코드를 가질지라도 * 다른 클래스를 정의하는 클래스 로더 일뿐입니다. 따라서 "Java 클래스는 하나의 jvm 당 한 번만 초기화됩니다."라는 문장은 정확하고 정확합니다. 게다가, 인용 된 코드는 * 초기화 *가 아닌 클래스의 *로드 * 만 구현합니다. 초기화가 한 번만 발생하는지 확인하는 작업은 여전히 ​​JVM에 남아 있습니다. – Holger

관련 문제