2011-11-19 2 views
0

그래서 저는 2 년 전부터 상당히 복잡한 애플릿 구조를 가지고 있으며 그 안에있는 전역 클래스에 대한 질문이 있습니다. 기본적으로 동일한 페이지에 3 개의 애플릿이 있으며 서로 다른 방식으로 상호 작용합니다. 혼란스러워하는 부분은 모두 동일한 클래스의 전역 (정적) 변수를 공유한다는 사실입니다. 어떻게 이런 일이 발생하고 있습니까? 각 애플릿이 자체 환경을 가지고 있지 않으므로 다른 애플릿과 동일한 정적 변수에 액세스 할 수 없다는 인상하에있었습니다. 예를 들어 나는 애플릿 A를이있는 경우 :왜 여러 애플릿이 하나의 전역 클래스에 액세스 할 수 있습니까?

Globals.globalVar = 5; 

을 그리고이 애플릿 B :

int x = Globals.globalVar; 

그리고 나는 방법을 알고 싶습니다 A는 다음 X 5가 될 것이다 후에 B가 시작되도록 이것은 JVM에서 정확히 처리되는데, 이는 나에게 전혀 이해가되지 않는다. 이 동작은 두 개의 개별 Java 응용 프로그램이 동시에 정적 변수에 액세스 할 수있는 동시에 실행되는 경우를 의미합니까? 미리 감사드립니다.

답변

4

이전 버전과의 호환성을 위해 그것이 정의 된 방식입니다. http://download.oracle.com/javase/6/docs/technotes/guides/jweb/applet/applet_execution.html#cache 참조 :

보통을,이 애플릿은 동일한 코드베이스 및 아카이브 매개 변수가있는 경우, 그들은 같은 클래스 로더 인스턴스에 의해로드됩니다. 이 동작은 이전 버전과의 호환성을 위해 필요하며 실제 응용 프로그램에서 에 의존합니다. 결과적으로 동일한 웹 페이지에있는 복수 애플릿이 Java 언어 수준에서 서로의 정적 변수 에 액세스 할 수 있으므로 하나의 애플리케이션으로 구성되는 것처럼 여러 애플릿 이 효과적으로 작성되도록 허용 할 수 있습니다.

이 기능을 사용하면 특정 종류의 응용 프로그램을 편리하게 작성된 수 있지만 특정 단점이 있습니다. 특히 동일한 애플릿의 여러 인스턴스가 활성화되어있을 때 애플릿의 종료를 방해합니다. 애플릿의 정적 모델 이 다시 초기화 될 때와 정확히 동일한 애플릿이 실행될 때까지 이 유지 될 때 정확히 지정되지 않기 때문에 애플릿 프로그래밍 모델 이 더 복잡해집니다. 특정 요청을 시작한 애플릿을 정확하게 식별 할 수 없기 때문에 Java 플러그인에서 특정 사용자 인터페이스 작업의 부정확 한 동작이 발생합니다.

이러한 이유로 새로운 Java Plug-in은 애플릿을 기반으로 애플릿에서 클래스 로더 캐시를 사용하지 않도록 선택할 수있는 방법을 제공합니다.

+0

매우 흥미 롭습니다. 감사합니다. – SuperTron

관련 문제