2010-04-20 2 views
3

일부 작업을 수행 할 라이브러리를 확장 중입니다. 다음은 코드입니다.Java 정적 및 스레드 안전성 또는 수행 할 작업

public static synchronized String decompile(String source, int flags,UintMap properties,Map<String,String> namesMap) 
    { 
     Decompiler.namesMap=namesMap; 
     String decompiled=decompile(source,flags,properties); 
     Decompiler.namesMap=null; 
     return decompiled; 

    } 

namesMap은 정적 변수입니다. 그 스레드가 안전하지 않습니까? 이 코드가 concurently 실행되면 namesMap 변수가 변경 될 수 있습니다. 이것으로 무엇을 할 수 있습니까?

+0

namesMap은 코드의 다른 곳에서 액세스됩니까? 그렇다면 특정 사례를 제시 할 수 있습니까? – Finbarr

+0

다른 디 컴파일() 만 액세스 할 수 있습니다. – GorillaApe

답변

5

방법decompile는 스레드 안전 (는 동시에 두 개의 스레드에서 실행되지 않습니다)하지만, 다른 아무것도 그 방법도 사용하는 것보다 경우 namesMap 후 아니, 전체이 스레드로부터 안전하지 않습니다 : 다른 메서드 보다 다른 스레드에서 실행중인 decompiledecompile 메서드가 맵을 수정하는 동안지도를 수정할 수 있으므로 아마도 신체 상해를 초래할 수 있습니다. :-)

네가하는 일에 해당되는 항목이 있는지 확인하려면 과 같은 java.util.concurrent 네임 스페이스의 클래스를 살펴볼 수 있습니다 (예 : ConcurrentHashMap).

편집 (댓글에 응답.) 정적 멤버 namesMap는 오직 decompile에 의해이 아닌 다른 것 (당신이 무엇에에 등을 참조하지 않음)에 의해 사용 경우, 너 괜찮아. 정적이라는 사실은 사용 된 유일한 장소가 직렬화되어 있다면 중요하지 않습니다.

+0

"* 오직 사용 된 *"은 언젠가 다른 개발자가이 암시 적 요구 사항을 잊어 버리고 다른 곳에서 사용하면 가짜 오류가 발생한다는 것을 의미합니다. –

+0

정적 멤버'namesMap'이 한 곳에서만 사용되는 경우 정적 멤버에서 메소드 매개 변수로 변경하지 않는 이유는 무엇입니까? 이렇게하면 모든 의심을 제거 할 수 있습니다. –

+0

@Aaron : 물론입니다. –

1

위에서 설명한 방법 decompile(String, int, UintMap, Map)이 실행되는 동안 다른 스레드가 namesMap으로 변경 될 가능성이있는 경우 참조를 지정하는 대신 전달 된 맵 복사본을 만들어야합니다.

Decompiler.namesMap= new HashMap<String, String>(namesMap); 

다른 스레드가지도에 포함 된 요소의 변경 사항을 할 것이며,지도 자체의 단지 구조, 당신이 있는지 확인해야 기회가있는 경우 decompile() 방법과 다른 namesMap을 사용하는 스레드는 동일한 잠금 장치에 의해 보호됩니다.

0

사실 Decompiler.namesMap=namesMap; 내가 보장 할 수있는 유일한 읽기 전용 namesMap

그러나 아무 그렇지 않으면 namesMap이 변경되는 코드에 .. 을 설정하는 곳 ...

입니다

String decompiled=decompile(source,flags,properties); 

은 동일한 namesMap을 사용합니다.

0

하나의 namesMap 만 있으므로 동일한 namesMap을 사용할 지에 대해 걱정할 필요가 없습니다. 그것은 것.