Java 클래스는 클래스가 먼저로드 될 때 하나의 JVM에 한 번만 초기화됩니다. 그리고 하나 이상의 스레드가 같은 클래스를 동시에로드하려고 할 수 있다고 생각합니다. JVM이 어떻게이 문제를 처리합니까? 잠금 장치와 같은 문제를 방지 할 수있는 메커니즘이 있습니까?Jave는 동시 클래스 초기화가 어떻게 일어나지 않도록합니까?
1
A
답변
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
관련 문제
- 1. 클래스 측 초기화가 전송되는시기는 언제입니까?
- 2. 클래스 초기화가 멤버 메소드를 검사합니까?
- 3. newInstance 호출에서 클래스 초기화가 실패했습니다.
- 4. 생성자 초기화가
- 5. 초기화가
- 6. 동시 코딩의 추상 클래스
- 7. PHP에서 클래스 변수의 자동 초기화가 가능합니까?
- 8. 페이지로드 후 클래스 필드의 Datepicker 초기화가
- 9. 클래스 변수의 초기화가 Ruby에서 무엇을 의미합니까?
- 10. 초기화가 클래스 메소드가 아닌 이유는 무엇입니까?
- 11. 개체가 특정 개체를 움직이지 않도록합니까?
- 12. 초기화가 smalltalk에서 언제 호출됩니까?
- 13. 어떻게 열면 액세스 데이터베이스가 수정 및 저장되지 않도록합니까?
- 14. 동시 처리는 어떻게 처리됩니까?
- 15. 동시 데이터를 어떻게 보내야합니까?
- 16. 9- 패치 파일의 중심이 스트라이크되지 않도록합니까?
- 17. 값에 대한 초기화가 성능에서 할당과 어떻게 비교됩니까?
- 18. 앱 초기화가 완료된 후 어떻게 코드를 실행합니까?
- 19. 컨트롤이 C#에서 다시 그려지지 않도록합니까?
- 20. 정적 초기화가 세대 급
- 21. 엠버 모두 ArrayProxy 초기화가
- 22. 정적 멤버가 인스턴스 클래스가 GC되지 않도록합니까?
- 23. NSUrlSession 응용 프로그램이 일시 중지되지 않도록합니까?
- 24. 문자 배열에서 null을 초과하여 메모리가 삭제되지 않도록합니까?
- 25. 스프링 보안 초기화가 실패했습니다.
- 26. jQuery 탭 초기화가 사라짐
- 27. 어떻게 동시 라이센스 사용을 측정해야
- 28. 동시 가비지 수집을 어떻게 해제합니까?
- 29. 대량의 동시 핑은 어떻게 수행합니까?
- 30. 동시 프로그래밍, 어떻게 세마포를 구성합니까?
'자바 클래스는 한 번만마다 초기화된다 하나의 jvm' - 그것은 사실이 아닙니다. 올바른 문장은''자바 클래스는 클래스 로더 당 한 번만 초기화됩니다' – rkosegi
http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.2 –