संभवत: इसी तरह के प्रश्न:डिफ़ॉल्ट रूप से जावा अस्थिरता में चर क्यों नहीं हैं?
Do you ever use the volatile keyword in Java?
आज मैं अपनी खेल डिबगिंग किया गया था; यह एक बहुत मुश्किल थ्रेडिंग समस्या थी जो हर कुछ मिनटों में दिखाई देगी, लेकिन पुन: पेश करना मुश्किल था। तो सबसे पहले मैंने अपनी प्रत्येक विधियों में
synchronized
कीवर्ड जोड़ा। वह काम नहीं किया। फिर मैंने प्रत्येक क्षेत्र में
volatile
कीवर्ड जोड़ा। समस्या सिर्फ खुद को ठीक लग रहा था।
कुछ प्रयोगों के बाद मुझे पता चला कि जिम्मेदार क्षेत्र GameState
ऑब्जेक्ट था जो मेरे खेल की वर्तमान स्थिति का ट्रैक रखता था, जो या तो खेल या व्यस्त हो सकता है। व्यस्त होने पर, गेम उपयोगकर्ता इनपुट को अनदेखा करता है। मेरे पास एक धागा था जो लगातार state
चर बदल गया, जबकि इवेंट थ्रेड state
चर बदलता है। हालांकि, एक थ्रेड परिवर्तनीय को बदलने के बाद, अन्य थ्रेड के लिए परिवर्तनों को पहचानने में कई सेकंड लगते हैं, जो अंततः समस्या का कारण बनता है।
यह राज्य चर volatile
बनाकर तय हुई थी।
डिफ़ॉल्ट रूप से जावा volatile
में चर क्यों नहीं हैं और volatile
कीवर्ड का उपयोग न करने का कोई कारण क्या है?
इसी कारण से विधियों को डिफ़ॉल्ट रूप से सिंक्रनाइज़ नहीं किया जाता है। –
@ एमपी: मुझे ऐसा नहीं लगता है। अस्थिर और सिंक्रनाइज़ समकक्ष नहीं हैं: अस्थिरता डेडलॉक्स का कारण नहीं बन सकती है। –