2012-01-04 10 views
5

यदि आप जावा में किसी ऑब्जेक्ट को क्रमबद्ध करते हैं और क्लस्टर में नोड्स को (सॉकेट पर) भेजते हैं तो क्या आपको स्वचालित रूप से थ्रेड सुरक्षा मिलती है?जावा में सीरियलाइजिंग: स्वचालित थ्रेड-सुरक्षा?

कहें कि आपके पास क्लस्टर है और प्रत्येक नोड में कई कोर हैं। सर्वर में जावा ऑब्जेक्ट है जो यह प्रत्येक क्लस्टर पर प्रक्रिया के लिए प्रत्येक कोर को भेजना चाहता है। यह उस वस्तु को क्रमबद्ध करता है और इसे प्रत्येक रिसीवर को भेजता है।

धारावाहिक के माध्यम से, वह ऑब्जेक्ट स्वचालित रूप से कुछ हद तक "गहरी प्रतिलिपि" है और क्या आप उस ऑब्जेक्ट पर स्वचालित रूप से थ्रेड सुरक्षा प्राप्त करते हैं? आपको क्लस्टर पर विभिन्न नोड्स के बीच कोई समरूपता समस्या नहीं मिल रही है क्योंकि वे स्मृति में एक ही स्थान तक नहीं पहुंच सकते हैं ... लेकिन नोड्स पर कोर के बीच क्या है?

+1

नहीं जरूरी नहीं। आपको विभिन्न मशीनों पर अलग-अलग वस्तुएं मिलती हैं।सब कुछ एक साथ कैसे काम करता है "थ्रेड सुरक्षा" निर्धारित करेगा। "धागे" के बीच साझा करने योग्य परिवर्तनीय स्थिति को कम करने के लिए * सरलता * सरलता का एक तरीका है। हालांकि, एकाधिक नोड्स * धागे नहीं हैं, बल्कि स्वतंत्र प्रक्रियाएं हैं। (हालांकि * साझा * वितरित स्मृति है, जो साझा म्यूटेबल स्थिति के पहलू को फिर से पेश करने के लिए काम करता है।) –

+0

संभावित डुप्लिकेट; http://stackoverflow.com/questions/4003741/java-object-serialization-thread-safe – Naved

+0

इसी तरह का शीर्षक - अलग प्रश्न – user651330

उत्तर

1

निश्चित रूप से यह "थ्रेड-सुरक्षित" है (इस अर्थ में कि आप इसे परिभाषित कर रहे हैं)। सीरियलाइजिंग परिभाषा द्वारा वस्तु की एक गहरी प्रति है और प्रत्येक कार्यकर्ता को एक अलग वस्तु मिल जाएगी।

4

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

नोट: यदि आप फिर से अद्यतन ऑब्जेक्ट भेजते हैं, तो आप अपडेट नहीं देख सकते हैं क्योंकि यह ऑब्जेक्ट का संदर्भ भेजता है। यदि आप एक अद्यतन भेजना चाहते हैं तो इस कारण से आपको प्रेषक पर reset() पर कॉल करना चाहिए। reset() का उपयोग करने का एक और कारण "मेमोरी लीक" से बचने के लिए है क्योंकि प्रेषक और रिसीवर अन्यथा उन सभी ऑब्जेक्ट को याद रखेंगे जिन्हें उन्होंने कभी लिखा/पढ़ा था।

+1

स्पष्टीकरण के लिए, 'रीसेट()' विधि पीटर के बारे में बात कर रहा है [ऑब्जेक्टऑटपुटस्ट्रीम] (http: //docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html#reset%28%29)। –

3

धारावाहिक के माध्यम से, वह ऑब्जेक्ट स्वचालित रूप से कुछ हद तक "गहरी प्रतिलिपि" है और क्या आप उस ऑब्जेक्ट पर स्वचालित रूप से थ्रेड सुरक्षा प्राप्त करते हैं?

यह स्पष्ट नहीं है तुम क्या मतलब है लेकिन ...

  • क्रमबद्धता की प्रक्रिया सुरक्षित सूत्र नहीं है। उदाहरण के लिए, यदि एक थ्रेड किसी ऑब्जेक्ट को क्रमबद्ध करता है जबकि दूसरा इसे बदल रहा है, तो क्रमबद्ध ऑब्जेक्ट (यानी बाइट्स का अनुक्रम) ऑब्जेक्ट के एक सतत स्नैपशॉट का प्रतिनिधित्व नहीं कर सकता है।

  • एक बार धारावाहिक होने के बाद, बाइट्स का अनुक्रम आम तौर पर उस थ्रेड के लिए सुलभ नहीं होता है जो इसके साथ गड़बड़ कर सकता है, इसलिए थ्रेड-सुरक्षा कोई समस्या नहीं है।

  • जब बाइट्स का अनुक्रम deserialized है, तो आप पूरी तरह से नई वस्तुओं को प्राप्त करते हैं। इन वस्तुओं के साथ कोई थ्रेड-सुरक्षा समस्या नहीं हो सकती है जब तक कि उन्हें खराब करने वाले थ्रेड को अन्य धागे में भी प्रकाशित न किया जाए।

आप क्योंकि वे स्मृति में एक ही जगह तक पहुँचने नहीं किया जा सकता क्लस्टर पर विभिन्न नोड्स के बीच किसी भी संगामिति समस्याओं को पाने के लिए नहीं जा रहे हैं ... लेकिन नोड्स पर कोर के बीच किस बारे में?

इससे कोई फर्क नहीं पड़ता कि ऑब्जेक्ट्स उसी क्रम स्थान में deserialized हैं जैसे वे क्रमबद्ध थे। Deserialization नई वस्तुओं बनाता है। वे मूल वस्तुओं के प्रतियां हैं।

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