थ्रेडिंग/समवर्ती समस्याएं प्रतिकृति के लिए कुख्यात रूप से मुश्किल हैं - जो कारणों से बचने या कम से कम कम से कम कम करने के कारणों में से एक है। यही कारण है कि अपरिवर्तनीय वस्तुएं इतनी मूल्यवान हैं। एक एकल धागे में परिवर्तनीय वस्तुओं को अलग करने की कोशिश करें, और फिर थ्रेड के बीच परिवर्तनीय वस्तुओं के आदान-प्रदान को ध्यान से नियंत्रित करें। "साझा" ऑब्जेक्ट्स के बजाए ऑब्जेक्ट हैंड-ओवर के साथ प्रोग्राम करने का प्रयास करें। उत्तरार्द्ध के लिए, पूरी तरह से सिंक्रनाइज़ किए गए नियंत्रण ऑब्जेक्ट्स (जो कि कारणों के लिए आसान हैं) का उपयोग करें, और सिंक्रनाइज़ ऑब्जेक्ट को अन्य ऑब्जेक्ट्स का उपयोग करने से बचें जिन्हें सिंक्रनाइज़ किया जाना चाहिए - यानी, उन्हें स्वयं निहित रखने की कोशिश करें। आपका सबसे अच्छा बचाव एक अच्छा डिजाइन है।
डेडलॉक्स डीबग करने के लिए सबसे आसान हैं, अगर आप डेडलॉक करते समय स्टैक ट्रेस प्राप्त कर सकते हैं। ट्रेस को देखते हुए, जिनमें से अधिकांश डेडलॉक पहचान करते हैं, कारण को इंगित करना आसान है और फिर कोड के बारे में कारण यह है कि इसे क्यों और कैसे ठीक किया जाए। Deadlocks के साथ, यह हमेशा विभिन्न आदेशों में एक ही ताले हासिल करने में एक समस्या होने जा रहा है।
लाइव ताले कठिन हैं - त्रुटि स्थिति में सिस्टम का निरीक्षण करने में सक्षम होने पर आपकी सबसे अच्छी शर्त है।
रेस की स्थिति प्रतिकृति के लिए बेहद मुश्किल हो रही है, और मैन्युअल कोड समीक्षा से पहचानना भी मुश्किल है। इनके साथ, जिस मार्ग को मैं आमतौर पर लेता हूं, प्रतिकृति के लिए व्यापक परीक्षण के अलावा, संभावनाओं के बारे में कारण है, और सिद्धांतों को साबित करने या अस्वीकार करने के लिए जानकारी लॉग करने का प्रयास करना है। यदि आपके पास राज्य भ्रष्टाचार का प्रत्यक्ष सबूत है तो आप भ्रष्टाचार के आधार पर संभावित कारणों के बारे में सोच सकते हैं।
सिस्टम जितना जटिल होगा, कंसूरेंसी त्रुटियों को ढूंढना कठिन होगा, और इसके व्यवहार के बारे में कारण होगा। JVisualVM और रिमोट कनेक्ट प्रोफाइलर्स जैसे टूल का उपयोग करें - यदि आप किसी त्रुटि स्थिति में किसी सिस्टम से कनेक्ट कर सकते हैं और थ्रेड और ऑब्जेक्ट का निरीक्षण कर सकते हैं तो वे जीवन बचतकर्ता हो सकते हैं।
इसके अलावा, संभावित व्यवहार में मतभेदों से सावधान रहें जो सीपीयू कोर, पाइपलाइनों, बस बैंडविड्थ आदि की संख्या पर निर्भर हैं। हार्डवेयर में परिवर्तन समस्या को दोहराने की आपकी क्षमता को प्रभावित कर सकते हैं। कुछ समस्याएं केवल एकल-कोर CPU पर दूसरों को बहु-कोर पर दिखाएंगी।
एक आखिरी बात, सिस्टम पुस्तकालयों के साथ वितरित समवर्ती वस्तुओं का उपयोग करने का प्रयास करें - उदाहरण के लिए जावा java.util.concurrent
में आपका मित्र है। अपनी खुद की समवर्ती नियंत्रण वस्तुओं को लिखना कठिन और खतरे से भरा हुआ है; यदि आपके पास कोई विकल्प है, तो इसे विशेषज्ञों को छोड़ दें।
ऐसे उपकरण हैं जो रेस की स्थिति का पता लगा सकते हैं। .NET के लिए आप माइक्रोसॉफ्ट द्वारा [CHESS] (http://research.microsoft.com/en-us/projects/chess/) पर एक नज़र डाल सकते हैं जो प्रत्येक संभावित इंटरलीविंग के लिए कोड चलाकर दौड़ की स्थिति का पता लगाने का प्रयास करता है। जावा के लिए आप [थ्रेडसेफ] (http://www.contemplateltd.com/threadsafe) प्राप्त कर सकते हैं जो विशेष रूप से समवर्ती बग का पता लगाने और डिबग करने के लिए एक उपकरण है। –
FindBugs संभावित थ्रेडिंग त्रुटियों को ढूंढने के लिए एक अच्छा स्थिर विश्लेषण टूल भी है। –