निम्न वर्ग चलाते समय निष्पादन सेवा अक्सर डेडलॉक होगी।हैश मैप ऑपरेशंस करते समय निष्पादक सेवा डेडलॉक क्यों करता है?
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);
}
}
तो ऐसा क्यों होता है? या बेहतर अभी तक - मैं यह सुनिश्चित करने के लिए एक परीक्षण कैसे लिख सकता हूं कि एक कस्टम अमूर्त मानचित्र के कार्यान्वयन थ्रेड सुरक्षित हैं? (कुछ कार्यान्वयन में कई मानचित्र हैं, एक कैश कार्यान्वयन आदि के लिए अन्य प्रतिनिधि)
कुछ पृष्ठभूमि: यह विंडोज 1.6.0_04 और 1.6.0_07 के तहत विंडोज पर होता है। मुझे पता है कि समस्या sun.misc.Unsafe.park (से आता है):
- मैं अपने Core2 जोड़ी 2.4Ghz लैपटॉप पर समस्या को पुन: कर सकते हैं लेकिन डिबग में नहीं चल रहा है, जबकि
- मैं अपने Core2 पर डीबग कर सकते हैं काम पर Quad, लेकिन मैं इसे आरडीपी पर लटका दिया है, इसलिए नहीं
अधिकांश जवाब नीचे कल तक एक स्टैक ट्रेस मिल HashMap के गैर धागा सुरक्षा के बारे में कर रहे हैं करने के लिए सक्षम हो जाएगा, लेकिन मैं मिल सकता है हैश मैप में कोई लॉक थ्रेड नहीं - यह सब निष्पादन सेवा कोड (और Unsafe.park()) में था। मैं कल धागे की बारीकी से जांच करूँगा।
यह सब क्योंकि एक कस्टम सार नक्शा कार्यान्वयन थ्रेड-सुरक्षित नहीं था इसलिए मैंने यह सुनिश्चित करने के लिए सेट किया कि सभी कार्यान्वयन थ्रेड-सुरक्षित होंगे। संक्षेप में, मैं यह सुनिश्चित करना चाहता हूं कि ConcurrentHashMap आदि की मेरी समझ ठीक वही है जो मुझे उम्मीद है, लेकिन निष्पादन सेवा को अजीब कमी के कारण मिल गया है ...
कल के लिए मेरे वर्तमान कार्रवाई: सूत्र के लिए 1. जांच बारीकी से HashMap में बंद कर दिया [आकार बदलने] कोड 2. अपग्रेड नवीनतम वीएम – Stephen
लिए आप किसी भी धागे का आकार बदलने में बंद कर दिया नहीं मिलेगा - वे का आकार बदलने और बाहर निकलने होगा। कॉल करने योग्य फिर से चलने वाले थ्रेड के लिए जांचें। –