문제

로깅 클래스에 정의 된 정적 객체가 다음과 같습니다.

   class myLoggingClass {
     static java.util.Properties properties;
     ...
     ...
   }

내 참고서에 따르면, 이것은 속성 객체가 내 클래스의 모든 인스턴스에서 공유 함을 의미합니다.

이 정의가 충분하지 않습니다. 프로젝트의 각 응용 프로그램에서 두 번 이상 호출되는 수업을 작성하고 있습니다.

또한 우리 프로젝트는 동일한 Tomcat 컨테이너에서 실행되는 여러 웹 서비스를 사용합니다. 각 웹 서비스에는 여러 스레드가있을 수 있습니다.

호스트에서 실행되는 Java Virtual Machine은 Tomcat 외부에서 실행되는 하나 이상의 웹 서비스 클라이언트 응용 프로그램을 실행할 수도 있습니다.

따라서이 정의에 따르면 Tomcat은 스레드가있는 여러 웹 서비스를 실행할 수 있으며 각각 여러 객체가 있으며 수업 인스턴스가 포함될 수 있습니다.

Tomcat 외부에서 한 두 개의 웹 클라이언트가있을 수 있지만 동일한 JVM 내에있을 수도 있습니다. 일 것이다 모두 이 클래스의 인스턴스 중 동일한 속성 객체를 공유합니까? 그것은 JVM 전체가 될 것입니다.

정적 객체가있는 경우 ~ 아니다 JVM 전체에서, 누구든지 각각이 존재하는 수준에서 아는 사람이 있습니까? Tomcat 컨테이너 당 하나? 웹 서비스 당 1 개, 독립형 웹 서비스 클라이언트 응용 프로그램 당 하나는?

이유 : 속성을 업데이트 할 때 java.util.properties에서 java.lang.concurrentupdateexception을 받고 있습니다.

정적 부울 변수를 사용하여 클래스가 업데이트 될 때 속성 객체를 "잠그기"하지만 예외가 발생하지는 않습니다.

이것은 내 수업에 사용 된 정적 객체가 java.util.properties에서 사용 된 것과 같은 범위 수준에 있지 않을 수 있다고 믿게합니다. 그러나 그것은 단지 추측 일뿐입니다.

도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

당신의 원인 ConcurrentModificationException 당신이 Properties 한 스레드에서 반대하는 동안 다른 스레드는 동시에 수정합니다. 너는 이것을 못해.

여기에서 언급 한 잠금 장치에 대해 자세히 설명해 주시겠습니까?

정적 부울 변수를 사용하여 클래스가 업데이트 될 때 속성 객체를 "잠그기"하지만 예외가 발생하지는 않습니다.

?

Java에서 내장 잠금 및 동기화 방법을 사용하는 것처럼 들리지 않기 때문입니다.

이와 같은 것은 스레드가 속성 객체를 읽지 못하게하는 동안 다른 스레드는 다음을 업데이트합니다.

static Object lockObject = new Object();

...

synchronized(lockObject) {
     // access the Properties object
}

이 작업을 수행해야합니다 모든 속성 객체에 액세스하여 읽거나 수정하십시오.

또한 모든 인스턴스 또는 정적 잠금 장치간에 데이터를 공유하기 위해 정적 객체를 권장하지 않을 것입니다. 글로벌 데이터는 사악하지만 마치 어떤 이유로 든 필요로 들립니다.

다른 팁

Statics는 "클래스의 모든 사례에 의해 공유되지 않는다"는 것은 아닙니다. 관련이 없습니다 경우에; 그들은에 속합니다 자체를 입력하십시오. 특히, 정적 변수는없이 완벽하게 사용할 수 있습니다 어느 인스턴스가 생성됩니다.

그것은 정적의 범위에 대한 단서를 제공합니다. 그들은 Class 포함 된 클래스를 나타내는 개체는 ClassLoader 그것을로드했습니다.

라이브러리가 배치되는 위치에 따라 정적 변수는 JVM 전체 또는 웹 응용 프로그램이 넓을 수 있습니다.

라이브러리가 어떻게 배치되는지와 클래스 로더와 어떻게 관련되는지에 대한 Tomcat 문서를 살펴보십시오. 예를 들어, 여기에 있습니다 Tomcat 6.0 클래스 로더 방법 가이드, 그리고 5.5에 해당합니다.

부울 "잠금"은 어떻게 작동합니까? 실제로 적절한 잠금을 사용해야합니다 (synchronized)) 속성 객체의 모든 사용 (읽기 및 쓰기, 전체 기간 동안 고정을 포함하여)이 적절하게 잠겨 있는지 확인하십시오.

"라이브"를 바꾸는 대신 Properties 물체, 당신은 그것을 불변으로 취급하는 것을 고려 했습니까? 따라서 속성을 업데이트하려면 사본을 가져 와서 변경 한 다음 사본을 "라이브"버전으로 만드십시오. 여전히 두 개의 다른 스레드가 동시에 변경하는 것을 방지해야하지만 (또는 일부를 잃을 수도 있음) 독서 측면을 훨씬 쉽고 효율적으로 만들 수 있습니다.

당신은 그러한 범위를 찾을 수 있습니다 static 변수는 클래스를로드 한 클래스 로더 당 하나로 제한됩니다. Tomcat이 어떻게 클래스 로더를 정렬하는지 잘 모르겠으므로 그 환경에서 범위의 범위가 무엇인지 말하기는 어렵습니다.

클래스를 포함하는 항아리가 다른 애플리케이션의 각 웹 -INF/LIB에 복제되는 클래스 로더 문제 일 수 있습니까? 그렇다면이 항아리를 Tomcat Libs에 추가하고 응용 프로그램에 추가하려고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top