2010-07-15 13 views
7

मुझे पता है कि SimpleDateFormat और NumberFormat थ्रेड सुरक्षित नहीं हैं।
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500जावा संदेशफॉर्मैट क्लास थ्रेड सुरक्षित है? (SimpleDateFormat के विपरीत)

लेकिन संदेश प्रारूप जैसे अन्य प्रारूप वर्गों के बारे में क्या?

फोर्टिफ़ाई 360 "संदेशफॉर्मैट.फॉर्मैट (स्ट्रिंग, ऑब्जेक्ट ...)" स्थिर विधि को "रेस कंडीशन - फॉर्मेट फ़्लॉ" समस्या के रूप में उपयोग करने के लिए फ़्लैग कर रहा है, लेकिन जब मैं संदेशफॉर्मैट के स्रोत कोड का विश्लेषण करता हूं, तो मैंने देखा कि उस विधि में, यह संदेशफॉर्मैट का एक नया स्थानीय उदाहरण बनाता है।

क्या जावा संदेशफॉर्मैट क्लास थ्रेड सुरक्षित है?

उत्तर

9

javadocMessageFormat के लिए कहते हैं:

संदेश स्वरूपों सिंक्रनाइज़ नहीं कर रहे हैं। प्रत्येक थ्रेड के लिए अलग प्रारूप उदाहरण बनाने की अनुशंसा की जाती है। यदि एकाधिक थ्रेड एक प्रारूप समवर्ती रूप से उपयोग करते हैं, तो इसे को बाहरी रूप से सिंक्रनाइज़ किया जाना चाहिए।

तो आधिकारिक तौर पर, नहीं - यह थ्रेड-सुरक्षित नहीं है।

SimpleDateFormat के लिए दस्तावेज़ बहुत कुछ कहते हैं।

अब, दस्तावेज़ हो सकता है कि रूढ़िवादी हो, और व्यावहारिक रूप से यह कई धागे में ठीक काम करेगा, लेकिन यह जोखिम के लायक नहीं है।

+0

जावाडॉक दिखाने के लिए धन्यवाद, यह मेरे लिए पर्याप्त होगा। जब मैंने MessageFormat के स्रोत कोड को देखा, तो यह मेरे लिए भी स्पष्ट है कि यह थ्रेड सुरक्षित क्यों नहीं है। वह वर्ग नंबरफॉर्मेट और डेटफॉर्मैट का उपयोग करता है, दो वर्ग जो थ्रेड सुरक्षित नहीं हैं। – thenonhacker

6

आप विधि

public static String format(String pattern, Object... arguments) 

इस सूत्र के लिए सुरक्षित के बाद के रूप में जावाडोक में वर्णित है यह स्वरूपण करने के लिए एक नया MessageFormat बनाता है referrring रहे हैं।

Btw, आपका शीर्षक 'SimpleThreadFormat' :)

0

जावाडोक प्रति में एक अजीब टाइपो thats, MessageFormat वस्तुओं थ्रेड-सुरक्षित नहीं हैं। आप प्रत्येक थ्रेड के लिए एक अलग ऑब्जेक्ट बनाने के लिए ThreadLocal का उपयोग कर सकते हैं।

ThreadLocal<MessageFormat> threadLocalMessageFormat = 
    new ThreadLocal<MessageFormat>() { 
     @Override 
     protected MessageFormat initialValue() { 
      return new MessageFormat(pattern); 
     } 
    }; 

फिर आप threadLocalMessageFormat.get() का उपयोग वर्तमान थ्रेड के लिए एक MessageFormat प्राप्त करने के लिए कर सकते हैं।

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