2012-04-30 17 views
103

यहाँ मॉडल मैं लागू किया गया है:क्या मॉडल बीन (पुन: उपयोग) में स्थिर क्षेत्र के रूप में जीसन इंस्टेंस का उपयोग करना ठीक है?

public class LoginSession { 
    private static final Gson gson = new Gson(); 

    private String id; 
    private String name; 
    private long timestamp; 

    public LoginSession(String id, String name) { 
     this.id = id; 
     this.name = name; 
     this.timestamp = System.currentTimeMillis(); 
    } 

    public String toJson() { 
     return gson.toJson(this); 
    } 

    public static LoginSession fromJson(String json) { 
     checkArgument(!isNullOrEmpty(json)); 
     return gson.fromJson(json, LoginSession.class); 
    } 
} 

मैंने सोचा कि यह हर LoginSession उदाहरण के लिए नई Gson उदाहरण बनाने के लिए बेकार है।

लेकिन जो मुझे चिंता है, वह थ्रेड-सुरक्षा समस्या है। लगभग 1000+ उदाहरण/सेकंड बनाए जाएंगे।

क्या स्टोनिक फ़ील्ड के रूप में जीसन इंस्टेंस का उपयोग करना ठीक है?

किसी भी सलाह/सुधार के लिए धन्यवाद।

उत्तर

90

यह मेरे लिए ठीक लगता है। जीएसओएन इंस्टेंस में कुछ भी नहीं है जो इसे LoginSession के विशिष्ट उदाहरण से संबंधित बनाता है, इसलिए यह स्थिर होना चाहिए।

जीएसओएन should be thread-safe उदाहरण देता है, और bug regarding था जो तय किया गया था।

+7

हम जीएसओएन के साथ समवर्ती मुद्दों के कारण अभी दुर्घटनाग्रस्त हो गए थे। तो मुझे नहीं लगता कि यह 100% धागा सुरक्षित है - कम से कम तब जेसन को फोन नहीं कर रहा है। – slott

+0

@ स्लॉट, आप लोग कैसे गन्सन के उदाहरण पूल/पुन: उपयोग करते हैं? क्या आप हर बार धारावाहिक करने की आवश्यकता करते हैं? या थ्रेडलोकल पूल का उपयोग करें? –

+0

हम Google वॉली के साथ जीएसओएन का उपयोग करते हैं और जब हम JSON डेटा समवर्ती पार्स करते हैं तो हम इस समस्या को देखते हैं। जो मैं देख सकता हूं उससे यह इस तथ्य से संबंधित है कि हम डेटाटाइम मानों को पार्स करने के लिए टाइमस्टैम्प को परिभाषित करते हैं। – slott

8
टिप्पणियां मौजूदा इकाई परीक्षण वास्तव में बहुत परीक्षण नहीं होता है, सुरक्षा थ्रेड से संबंधित कुछ के साथ सावधान रहना के अनुसार

...

वहाँ धागा सुरक्षा के लिए जाँच एक unit test है:

/** 
* Tests for ensuring Gson thread-safety. 
* 
* @author Inderjeet Singh 
* @author Joel Leitch 
*/ 
public class ConcurrencyTest extends TestCase { 
    private Gson gson; 
    ... 

आप आश्चर्य हो सकता है कि क्या यह यूनिट परीक्षण प्रत्येक संभावित मशीन कॉन्फ़िगरेशन पर हर संभव समस्या को खोजने के लिए पर्याप्त है? इस पर कोई टिप्पणी?

Gson उदाहरण Json संचालन लागू करते हुए किसी भी राज्य को बनाए रखने नहीं करता है:

वहाँ भी docs में इस वाक्य है। तो, आप एक ही ऑब्जेक्ट को कई जेसन सीरियलाइजेशन और deserialization संचालन के लिए पुन: उपयोग करने के लिए स्वतंत्र हैं।

+2

मैंने कहा होगा कि यह यूनिट परीक्षण समेकन मुद्दों का पता लगाने के लिए अपर्याप्त रूप से अपर्याप्त था। सबसे पहले, MyObject एक छोटी कक्षा है जिसमें कोई जटिल संग्रह शामिल नहीं है, इसलिए सूचियों और मानचित्रों के समवर्ती डी/क्रमिकरण और अन्य जटिल वस्तुओं का परीक्षण नहीं किया जाता है। दूसरा, क्रमशः केवल 10 धागे में से प्रत्येक बार 10 बार पुनरावृत्त होता है, जो अपर्याप्त है।तीसरा, समेकन दोष किसी भी तरह परीक्षण करने के लिए कुख्यात रूप से कठिन हैं क्योंकि विभिन्न हार्डवेयर कॉन्फ़िगरेशन में अलग-अलग रनटाइम विशेषताएं होती हैं, इसलिए यदि कोई भी परीक्षण सभी कॉन्फ़िगरेशन पर चलाने की गारंटी है तो केवल तभी मान्य होगा। –

+0

उदाहरण के लिए, इस परीक्षण को एक कोर कोर मशीन पर कोई समवर्ती गलती नहीं मिलेगी, क्योंकि प्रत्येक थ्रेड शायद एक बार टाइम्सलाइस के भीतर पूरा हो जाएगा और इसलिए थ्रेड लगातार चलेंगे, न कि समवर्ती रूप से। –

+1

यह नहीं कहने के लिए कि यह थ्रेडसेफ नहीं है, केवल यह है कि यह परीक्षण दूरस्थ रूप से गारंटी भी नहीं देता है कि यह है। –

10

कोर Gson कक्षा थ्रेड-सुरक्षित है। मुझे बस एक थ्रेड-सुरक्षा समस्या का सामना करना पड़ा जो माना जाता था कि जीएसओएन के साथ। यह समस्या तब हुई जब और JsonSerializerDate पार्सिंग और स्वरूपण के लिए कस्टम का उपयोग किया गया। चूंकि यह निकला, थ्रेड-सुरक्षा समस्या मेरे विधि के स्थिर SimpleDateFormat उदाहरण के उपयोग के साथ थी जो थ्रेड-सुरक्षित नहीं है। एक बार जब मैंने ThreadLocal उदाहरण में स्थैतिक SimpleDateFormat लपेट लिया, तो सब ठीक काम किया।

+2

Apache commons FastDateFormat (कॉमन्स-लैंग का हिस्सा) का उपयोग करने के लिए एक बेहतर विकल्प हो सकता है, जो स्पष्ट रूप से थ्रेडसेफ है। https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/FastDateFormat.html – Zaan

+0

धन्यवाद @Zaan। महान टिप! – entpnerd