2011-12-16 1 views
3

안전 정적 메소드 스레드 내부 클래스 인스턴스입니다.내가를 ClassA 내부에 두 개의 해시 맵이</p> <pre><code>public static void foo(){ final ClassA a = new ClassA(); } </code></pre> <p>다음처럼 정적 방법이

해시 맵 스레드가 안전합니까 ...?

+0

지도가 어떻게 사용되고 정의되는지는 분명하지 않습니다. HashMap은 스레드로부터 안전하지 않습니다. 그러나 동시 해시 맵을 참조하십시오. http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html – Adrian

답변

0

복수 스레드로 객체 a 내부의 해시 맵에 액세스 할 것인지 또는 다중 스레드로 foo 메서드를 호출 할 것인지 여부는 명확하지 않습니다.

첫 번째 경우 컬렉션의 스레드 안전성은 외부 컨텍스트와 아무 관련이 없습니다. 즉 정적 컨텍스트에서 생성되었는지 여부입니다. 그래서 아니요, 다중 스레드로 객체 a에서 해시 맵에 액세스하려고하면 예기치 않은 동작이 발생합니다. synchronized 블록을 사용하여 액세스를 규제해야합니다.

두 번째 경우, 각 스레드는 스택에 foo의 다른 사본을 가지고 ClassA의 다른 인스턴스를 할당합니다. 따라서 그들은 서로 다른 HashMaps을 가지고 있기 때문에 충돌하지 않을 것입니다.

함께 작업하고있는 사례를 명확히 설명하십시오.

0

클래스 HashMap은 스레드로부터 안전하지 않습니다.

이 구현은 동기화되지 않습니다. 복수의 thread가이 동시에지도, thread의 적어도 하나는 구조적으로 맵을 변경하는 경우, 당신이 코드 foo를 호출 할 때 새 ClassA 각 시간을 얻을 것이다 외부

를 동기화되므로 두 개의 서로 다른해야 foo을 호출하는 스레드는 ClassA의 다른 인스턴스에 액세스 할 수 있습니다. ClassA 내부의 해시 맵이 정적이거나 공유되지 않는다고 가정하면 코드가 올바르게 작동해야합니다.

+0

하지만 새로운 작업은 기본 작업입니까? – chance

+0

threadsafe 맵이 걱정된다면 Collections.synchronizedMap 또는 ConcurrentHashMap – luketorjussen

+0

@chance를 사용할 수 있습니다. 예를 들어 두 스레드가 동시에 힙 메모리를 할당 할 수 없도록하는 시스템 전체 잠금이 있습니다. – Tudor

0

코드를 작성하는 방법은 모든 스레드에서 정적 메서드를 사용할 수있게하므로 각 스레드는 클래스의 자체 개체를 가져옵니다. 따라서 각 클래스는 자체 해시 맵을 갖게됩니다.

그러나 모든 스레드에 대해 동일한 해시 맵을 원할 경우 synchronized으로 해보십시오.

3

HashMapsclassA 내부는 (모든 새로운 ClassA() 새로운 생성)이 아닌 정적 인 경우에, 당신은 여러 스레드에서 foo는 호출 할 수있는 단 하나의 thread가 해당 스레드 생성 classA의 인스턴스 내부의 HashMaps을 통해 실행됩니다 보장 할 수 .

1

나는 동의하지 않습니까?

ClassA의 새 인스턴스가 메서드 내에 만들어집니다. 여러 스레드가 메소드에 액세스하는 경우에도 각각 고유 한 HashMap이 작동합니다.

ClassA가 인스턴스 변수 인 경우 다른 값을 갖습니다. 또한 ClassA가 맵에 동시에 액세스하면 스레딩 문제가 발생합니다.

또한지도가 정적 인 경우 ClassA의 여러 인스턴스가 액세스 할 수 있으며 예, 이는 probamatic입니다.

0

HashMap는 스레드 안전하지 않습니다,하지만 당신은 다음 세 가지가 하나 개의 스레드에 국한되어, foo() 외부 예를 a이나 그 두 해시지도를 게시 결코 스레드 안전하지 않을 필요가 가정.

a 또는 해시 맵을 게시하거나 해시 맵이 ClassA의 정적 멤버 인 경우 스레드 안전을 보장해야합니다. 해시 맵이나 다른 상태 변수를 포함하는 불변 조건이 없다고 가정하면이를 달성하기 위해 단순히 ConcurrentHashMap을 사용할 수 있습니다. 그러한 불변량이있는 경우 이상적으로 가능한 한 상태 변수에 가깝게 동기화해야합니다 (foo()이 아닌 ClassA).

관련 문제

 관련 문제