Struts에서 MessagerEsources factory의 게으른 인스턴스화 1.2.7 인 이유는 무엇입니까?
-
19-09-2019 - |
문제
두 번 확인 된 잠금 문제가 있으므로 다음 방법에 대한 동시 액세스를 보장하기 위해 동기화를 사용해야합니다 (org.apache.struts.util.messagerEsources 클래스) :
게으른 인스턴스화
public synchronized static MessageResources getMessageResources(String config) {
if (defaultFactory == null) {
defaultFactory = MessageResourcesFactory.createFactory();
}
return defaultFactory.createResources(config);
}
사용하지 않는 이유 :
열렬한 인스턴스화
static {
// Construct a new instance of the specified factory class
try {
if (clazz == null)
clazz = RequestUtils.applicationClass(factoryClass);
MessageResourcesFactory defaultFactory =
(MessageResourcesFactory) clazz.newInstance();
} catch (Exception e) {
LOG.error("MessageResourcesFactory.createFactory", e);
}
}
그리고:
public static MessageResources getMessageResources(String config) {
return defaultFactory.createResources(config);
}
그것은 getMessageResources 메소드에 동시에 액세스 할 수있게 해주 며, 적어도 제 경우에는 꽤 몇 번이라고 불릴 수 있습니다.
동기화 된 사용을 사용하지 않을 때의 의미는 다음과 같습니다.
해결책 4
나는 그것이 org.apache.struts.util.messageresources를 재정의하든 상관없이 멀티 스레드 모드에서 잘 작동하는지 확인하는 방법이라고 생각합니다.
다른 팁
~이다 MessageResourcesFactory
스레드 안전? 그만큼 synchronized
메소드는 필드 설정과 createResources
방법 호출. 스레드 안전 인 경우 잠금 장치는 필드를 설정하고 메소드 호출을 임계 섹션 외부에두기 위해 이동할 수 있습니다.
현대 JVM에서 동기화 된 방법에 의해 발생 된 오버 헤드는 중요하지 않을 정도로 작습니다. 동기화 된 Lazy-Init Factory Method에 대한 후속 호출은 동기화되지 않은 열성적인 인니 니트 방법을 호출하는 것만 큼 빠릅니다.
코드의 관점에서, 게으른 이니 니트 접근법은 정적 이니셜 라이저 블록을 사용하는 것보다 (내 의견으로는) 더 간단하고 이해하기 쉽습니다 (내 의견으로는). 또한 정적 초기 블록이 실패하면 어디서 왜 그런지 알아내는 것이 매우 혼란 스러울 수 있습니다.
아무 이유가 없다면 MessageResourceFactory
조기에 초기화 할 수는 없습니다 (예 : 특정 서블릿 리소스를 먼저 초기화해야합니다). 솔루션이 더 좋다고 생각합니다. Struts 팀이 공장을 게으르게로드 할 이유가 없다고 생각합니다. 이는이 작업을 수행 한 특정 개발자가 사용하는 데 익숙한 것입니다 (사람들은 필요하지 않은 경우에도 싱글 톤을 게으르게로드하는 경향이 있습니다).
버그 보고서를 제출하고 솔루션을 제안 해 보셨습니까?