Struts에서 MessagerEsources factory의 게으른 인스턴스화 1.2.7 인 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1187274

문제

두 번 확인 된 잠금 문제가 있으므로 다음 방법에 대한 동시 액세스를 보장하기 위해 동기화를 사용해야합니다 (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 메소드에 동시에 액세스 할 수있게 해주 며, 적어도 제 경우에는 꽤 몇 번이라고 불릴 수 있습니다.

동기화 된 사용을 사용하지 않을 때의 의미는 다음과 같습니다.

http://en.wikipedia.org/wiki/double-checked_locking

도움이 되었습니까?

해결책 4

나는 그것이 org.apache.struts.util.messageresources를 재정의하든 상관없이 멀티 스레드 모드에서 잘 작동하는지 확인하는 방법이라고 생각합니다.

다른 팁

~이다 MessageResourcesFactory 스레드 안전? 그만큼 synchronized 메소드는 필드 설정과 createResources 방법 호출. 스레드 안전 인 경우 잠금 장치는 필드를 설정하고 메소드 호출을 임계 섹션 외부에두기 위해 이동할 수 있습니다.

현대 JVM에서 동기화 된 방법에 의해 발생 된 오버 헤드는 중요하지 않을 정도로 작습니다. 동기화 된 Lazy-Init Factory Method에 대한 후속 호출은 동기화되지 않은 열성적인 인니 니트 방법을 호출하는 것만 큼 빠릅니다.

코드의 관점에서, 게으른 이니 니트 접근법은 정적 이니셜 라이저 블록을 사용하는 것보다 (내 의견으로는) 더 간단하고 이해하기 쉽습니다 (내 의견으로는). 또한 정적 초기 블록이 실패하면 어디서 왜 그런지 알아내는 것이 매우 혼란 스러울 수 있습니다.

아무 이유가 없다면 MessageResourceFactory 조기에 초기화 할 수는 없습니다 (예 : 특정 서블릿 리소스를 먼저 초기화해야합니다). 솔루션이 더 좋다고 생각합니다. Struts 팀이 공장을 게으르게로드 할 이유가 없다고 생각합니다. 이는이 작업을 수행 한 특정 개발자가 사용하는 데 익숙한 것입니다 (사람들은 필요하지 않은 경우에도 싱글 톤을 게으르게로드하는 경향이 있습니다).

버그 보고서를 제출하고 솔루션을 제안 해 보셨습니까?

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