다음 클래스를 실행하면 ExecutionService가 종종 교착 상태가됩니다.HashMap 작업을 수행 할 때 ExecutorService가 교착 상태에 빠지는 이유는 무엇입니까?
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorTest {
public static void main(final String[] args) throws InterruptedException {
final ExecutorService executor = Executors.newFixedThreadPool(10);
final HashMap<Object, Object> map = new HashMap<Object, Object>();
final Collection<Callable<Object>> actions = new ArrayList<Callable<Object>>();
int i = 0;
while (i++ < 1000) {
final Object o = new Object();
actions.add(new Callable<Object>() {
public Object call() throws Exception {
map.put(o, o);
return null;
}
});
actions.add(new Callable<Object>() {
public Object call() throws Exception {
map.put(new Object(), o);
return null;
}
});
actions.add(new Callable<Object>() {
public Object call() throws Exception {
for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {
iterator.next();
}
return null;
}
});
}
executor.invokeAll(actions);
System.exit(0);
}
}
그렇다면 왜 이런 일이 발생합니까? 또는 더 나은 방법은 - 사용자 정의 추상 맵의 구현이 스레드로부터 안전함을 보장하는 테스트를 작성하려면 어떻게해야합니까? (일부 구현에는 여러 맵이 있고 다른 구현자는 캐시 구현에 대한 대리자 등)
일부 배경 : Windows에서 Java 1.6.0_04 및 1.6.0_07에서 발생합니다. 나는 문제가) sun.misc.Unsafe.park (에서 오는 것을 알고 :
- 내 코어 2 듀오 2.4 기가 헤르츠 고출력 노트북에 문제를 재현하지만, 디버그에서 실행되지 동안 수
- 내 코어 2에서 디버깅 할 수 있습니다 직장에서 쿼드는,하지만 난 RDP 위를 걸어, 그래서 아래 내일까지 에게
대부분의 답변을 스택 트레이스를 얻을의 HashMap의 비 스레드 안전에 대한 있습니다 할 수 없습니다,하지만 난 찾을 수 HashMap에 잠긴 스레드가 없습니다. ExecutionService 코드 (및 Unsafe.park())에 모두 들어 있습니다. 나는 내일 실을 면밀히 조사 할 것이다.
이 모든 것은 사용자 정의 추상 맵 구현이 스레드로부터 안전하지 않았기 때문에 모든 구현이 스레드로부터 안전함을 보장하기 위해 설정되었습니다. 본질적으로, 나는 ConcurrentHashMap에 대한 나의 이해가 정확히 내가 기대하는 바를 확실히하고 싶지만, ExecutionService가 이상하게 부족하다는 것을 발견했다. ...
나의 현재 행동 : - 그들은 크기를 조정하고 종료됩니다 스레드 밀접하게 1.이 HashMap의 중지 코드 당신은 어떤 스레드가 크기 조정 중지받지 않습니다 최신 VM – Stephen
에 2. 업그레이드 [크기 조정]. Callable을 반복하는 스레드가 있는지 확인하십시오. –