2010-08-08 5 views
1

이 같은 응용 프로그램이있는 경우 :응용 프로그램의 상태를 안전하게 캡처하는 방법은 무엇입니까?

Class Application { 
    List state1 = new ArrayList(); 
    Map state2 = new HashMap(); 
} 

을 그리고 난 같은 응용 프로그램 (의 상태를보고하기 위해 사용하는 다른 스레드에서 RPC 서비스 실행이 있습니다에 포함되는 상태 1에서 얼마나 많은 항목을, 상태 2 키). 어떻게해야할까요? state1 및 state2 필드에 액세스 할 때 동기화를 사용하지 않는 방법을 찾고 있습니다 (응용 프로그램의 성능이 저하 될 수 있음).

+0

서식있는 코드; 잘못된 경우 되돌려주십시오. – trashgod

답변

1

동기화 비용에는 두 가지 측면이 있습니다.

  1. 오버 헤드 synchronized; 및

  2. 해당 블록 내에서 수행되는 작업 비용.

    public synchronized int[] getState() { 
    return new int[] { state1.size(), state2.size() }; 
    } 
    

    this이 잠금을 사용됩니다

당신에게 예를 제공합니다. 이 경우의 작업은 매우 저렴합니다 (즉, size()Colleciton 또는 Map). 그래서 걱정할 유일한 오버 헤드는 synchronized의 비용입니다.

현대 JVM의 경우 비용이 너무 낮아서 극단적 인 경우를 제외하고는 걱정할 가치가 없습니다. "가장 극단적 인"의미는 그러한 호출 수가 대단히 많거나 필요한 대기 시간이 매우 낮은 곳 (하위 마이크로 초)을 의미합니다.

synchronized을 사용하십시오. 더 읽기 쉽고 성능이 단순히 뭔가 문제가되지 않는 이상 원하는대로 문제가되지 않습니다.

+0

하지만 cletus, 다음과 같이 state2의 모든 키를 캡처해야하는 경우 public synchronized List getAllKeys() { \t List val = new ArrayList(); \t val.addAll (state2.keySet()); \t return val; } public synchronized void addItemToState2 (Object k, Object v) { \t state2.put (k, v); } addItemToState2는 초당 여러 번 호출되므로 getAllKeys는 거의 호출되지 않지만 여전히 모든 시간을 동기화해야합니다. 괜찮습니까? 죄송합니다. 여기에 메시지 서식을 지정하는 중입니다. ( – secmask

+0

@secmask 문제가 생길 때까지 일반적인 조언을 통해 문제가 해결되지 않습니다 .1 초마다 1000 개의 키를 추가하고 어떤 준 현대 기계에서도 '동기화 된'오버 헤드를 발견 할 수 있습니다. – cletus

관련 문제