2012-08-26 12 views
14

मैं इस धारणा के तहत काम कर रहा हूं कि न तो Date और न ही Calendar थ्रेड-सुरक्षित हैं, लेकिन, हाल ही में एक चर्चा के दौरान, एक सहकर्मी ने मुझे बताया कि Calendar थ्रेड-सुरक्षित था।java.util.Calendar थ्रेड सुरक्षित है या नहीं?

तो, मैंने कुछ शोध किया, और कुछ भी नहीं आया। बहुत सारे लोग इसके धागे से सुरक्षित बहस कर रहे हैं, और बहुत से लोग बहस करते हैं कि यह थ्रेड-सुरक्षित नहीं है। और, इसे ऊपर करने के लिए, प्रलेखन Calendar के लिए नहीं, और न ही Date के लिए, किसी भी तरह से या किसी अन्य चीज़ को नहीं कहता है।

तो, यह कौन है?

+3

http: // stackoverflow।कॉम/प्रश्न/6245053/कैसे-टू-मेक-ए-स्टेटिक-कैलेंडर-थ्रेड-सुरक्षित देखें कि –

+0

@AlexColeman ध्यान दें कि पहला जवाब "नहीं" कहता है, दूसरा जवाब "हां" कहता है, और इनमें से कोई भी चर्चा नहीं कुछ भी समर्थित है। हालांकि 'जोडा टाइम' के लिए –

+1

+1। यदि थ्रेड-सुरक्षा समस्याएं आपकी चिंता हैं तो इसका उपयोग करना एक अच्छा विकल्प होगा। – Sujay

उत्तर

24

यहाँ जावा 7

आप कोड आप उदाहरण के तरीकों में से कोई भी सिंक्रनाइज़ किए जाते हैं देखेंगे पढ़ा है, और उदाहरण के खेतों में से कोई भी volatile हैं में Calendar और GregorianCalendar के स्रोत कोड के लिए एक कड़ी है। आप यह भी देखेंगे कि फ़ील्ड get विधियां कैलेंडर उदाहरण को म्यूटेट करने का कारण बन सकती हैं। और चूंकि कोई सिंक्रनाइज़ेशन नहीं किया गया है, इसलिए इस तरह के एक उत्परिवर्ती ऑपरेशन के बाद अलग-अलग धागे कैलेंडर ऑब्जेक्ट के फ़ील्ड के पुराने संस्करण देख सकते हैं।

रिकॉर्ड के लिए, क्षेत्र में उत्परिवर्तन कार्रवाई पाने के तरीकों इस विधि के लिए एक कॉल के दौरान इन/होता है:

1555 protected void complete() 
1556  { 
1557   if (!isTimeSet) 
1558    updateTime(); 
1559   if (!areFieldsSet || !areAllFieldsSet) { 
1560    computeFields(); // fills in unset fields 
1561    areAllFieldsSet = areFieldsSet = true; 
1562   } 
1563  } 

संक्षेप में, Calendar वर्ग थ्रेड-सुरक्षित नहीं है और GregorianCalendar नहीं है या तो क्योंकि यह गैर-थ्रेड-सुरक्षित फ़ील्ड और विधियों को प्राप्त करता है।

लेकिन इसके लिए मेरा शब्द न लें। स्रोत कोड का अपना विश्लेषण करें।


और, यह ऊपर बंद करने के लिए, प्रलेखन कहना नहीं है कुछ भी एक तरह से या किसी अन्य, नहीं कैलेंडर के लिए, न ही तिथि के लिए।

javadocs एक वर्ग के धागे की सुरक्षा निर्दिष्ट नहीं करते हैं, तो आप कि यह थ्रेड-सुरक्षित नहीं है मान लेना चाहिए।

4

ओरेकल से दस्तावेज़ीकरण थ्रेड-सुरक्षा के बारे में कुछ भी नहीं कहता है: http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

OpenJDK स्रोत कोड (b147 निर्माण) को लागू करता है एक गैर धागा सुरक्षित तरीका में java.util.Calendar, उदाहरण के लिए:

public void setTimeInMillis(long millis) { 
    // skipped 
    time = millis; 
    isTimeSet = true; 
    areFieldsSet = false; 
    computeFields(); 
    areAllFieldsSet = areFieldsSet = true; 
} 

मुझे लगता है कि यह मान लेना कि वर्ग नहीं धागा सुरक्षित है सुरक्षित है।

-1

- मैं कहाँ से अपने दोस्त के बारे में जानकारी मिल यकीन है कि नहीं हूँ, लेकिन सरल और सीधा संदर्भ में कहा जाए तो Calendar class isनहींThread safe

- मैं परमाणु बयान पर कोई synchronized कीवर्ड, और न ही कैलेंडर कक्षा में है और न ही इसकी उपवर्गों में volatile क्षेत्रों नहीं मिला।

+5

'सिंक्रनाइज़' या 'अस्थिर' कीवर्ड की उपस्थिति थ्रेड-सुरक्षा का संकेतक नहीं है – yegor256

संबंधित मुद्दे