2009-11-12 14 views
14

मैं चाहता था कि मेरे आवेदन में केवल एक TimeZone ऑब्जेक्ट है जिसका उपयोग कई स्थानों से SimpleDateFormat और Calendar ऑब्जेक्ट्स द्वारा किया जाएगा। यह हमेशा TimeZone.getTimeZone(ID) करने से बचने के लिए है।जावा का टाइमज़ोन थ्रेड-सुरक्षित है?

मुझे पता है SimpleDateFormat और Calendar कक्षाएं धागे सुरक्षित नहीं हैं, इसलिए मैं हमेशा एक नए धागे को नए उदाहरण बनाने के लिए कॉन्फ़िगर करता हूं। लेकिन TimeZone के बारे में क्या? यह मुझे स्पष्ट नहीं है कि मैं निम्नलिखित सुरक्षित रूप से कर सकता हूं:

final TimeZone tz = TimeZone.getTimeZone("GMT"); 
... 
//Thread 1. 
Thread t1 = new Thread(Runnable(){ 
    public void run() 
    { 
     Calendar cal = Calendar.getInstance(tz); 
     ... 
     SimpleDateFormat sdf = new SimpleDateFormat(); 
     sdf.setTimeZone(tz); 
     ... 
    } 
}); 
t1.start(); 
... 
//Thread 2. 
Thread t2 = new Thread(Runnable(){ 
    public void run() 
    { 
     Calendar cal = Calendar.getInstance(tz); 
     ... 
     SimpleDateFormat sdf = new SimpleDateFormat(); 
     sdf.setTimeZone(tz); 
     ... 
    } 
}); 
t2.start(); 
... 

धन्यवाद!

उत्तर

4

यह नहीं है।

और आपको इसकी आवश्यकता नहीं है। आप कोड के रूप में यह उपयोग करता है:

final TimeZone tz = TimeZone.getTimeZone("GMT"); 
...... 
// thread 1 SimpleDateFormat instance 
sdf.setTimeZone(tz); 

// thread 2 SimpleDateFormat instance 
sdf.setTimeZone(tz); 

आप एक ही समय क्षेत्र का उपयोग कर दो धागे है, लेकिन जब से तुम इसे संशोधित नहीं कर रहे हैं आप इसे सुरक्षित धागा होने की जरूरत नहीं है।

केवल एक चीज है कि आप संशोधित कर सकते हैं आईडी है, लेकिन फिर भी तुम ठीक कर रहे हैं, विशेषताओं में से बाकी के लिए कर रहे हैं केवल पढ़ने के लिए

एक ही तरीका है कि आप मुसीबत में पड़ सकते आईडी बदलकर है और यदि आप इसे हमेशा TimeZone.getTimeZone() से प्राप्त करते हैं, तो आप स्वयं को टाइमज़ोन कैश करते हैं, क्योंकि आप थ्रेड सुरक्षित हैं।

7

मैंने इसके लिए स्रोत कोड पर एक बार देखा और यह निष्कर्ष निकाला कि यह नहीं था।

JodaTime timezone कक्षा पर देखें। यह जावाडोक में कहता है कि यह थ्रेड-सुरक्षित और अपरिवर्तनीय है।

+0

+1: जावाडाइम जावा में दिनांक/समय करने का तरीका है। – BalusC

+1

मैंने टाइमज़ोन.getDefault() को बहु-थ्रेडेड वातावरण में अक्सर लटका दिया है। – Martin

1

आप अपने समय क्षेत्र को संशोधित नहीं कर रहे हैं, तो आपके कोड सुरक्षित के समयक्षेत्र के अंतर्निहित कार्यान्वयन धागा सुरक्षित है या नहीं (स्थिर तरीकों, (getTimeZone/getDefault/SetDefault) की तरह के अपवाद के साथ भले ही थ्रेड किया जाना चाहिए।

+0

दरअसल, TimeZone.getDefault() और TimeZone.setDefault() थ्रेड-स्थानीय डिफ़ॉल्ट प्राप्त करते हैं और सेट करते हैं। स्रोत कोड पर एक नज़र डालें! –

+0

नहीं :) इसकी नहीं, http://stackoverflow.com/questions/2176784/timezone-setdefault-changes-in-jdk6 – Tom

0

यह प्रकट होता है ठीक किया जाना है। यदि आप TimeZone.getDefault() है कि एक अलग कहानी होगी पर निर्भर थे। के रूप में एक और धागा संभावित TimeZone.setDefault बुला जा सकता है()।

+0

असल में, ** ** ** सुरक्षित होगा। 'TimeZone.getDefault()' और 'TimeZone.setDefault() 'थ्रेड-स्थानीय डिफ़ॉल्ट प्राप्त करें और सेट करें। स्रोत कोड पर एक नज़र डालें! –

+0

करेंगे - धन्यवाद! –

+0

@StephenC - नहीं यह सुरक्षित नहीं है। कृपया देखें http://stackoverflow.com/questions/2176784/timezone-setdefault-changes-in-jdk6 – Tom

2

कोई स्पष्ट प्रलेखन समयक्षेत्र कहा गया है कि नहीं है थ्रेड-सुरक्षित है, इसलिए सबसे सुरक्षित मार्ग यह मानता है कि यह थ्रेड सुरक्षित नहीं है।

टाइमज़ोन क्लास में आईडी और उसके जीएमटी ऑफसेट से संबंधित दो उदाहरण उत्परिवर्तक हैं। सामान्य ज्ञान यह कहता है कि कैलेंडर.getInstance और SimpleDateFormat में टाइमज़ोन ऑब्जेक्ट स्टेट को संशोधित करने वाला कोई व्यवसाय नहीं है (पहले मामले में, इसे एक लुक-अप कुंजी के रूप में उपयोग किया जा रहा है, और दूसरे में, फ़ॉर्मेटिंग संदर्भ के रूप में)।

सामान्य ज्ञान या निश्चितता - आपकी पसंद।

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