2010-01-27 17 views
7

जावा में वेक्टर द्वारा क्या मतलब है थ्रेड सुरक्षित और सिंक्रनाइज़ किया गया है, यह थ्रेड सुरक्षित कैसे बनाया जाता है। मैं कार्यान्वयन के आंतरिक विवरण देख रहा हूंजावा में वेक्टर में सिंक्रनाइज़ेशन

उत्तर

4

Vector को 'थ्रेड-सुरक्षित' माना जाता है क्योंकि वेक्टर के आंतरिक भाग को सिंक्रनाइज़ किया जाता है। add(), get(), size(), आदि जैसे तरीके सभी सिंक्रनाइज़ किए गए हैं कि Vector की आंतरिक संरचना में संशोधन और उस आंतरिक संरचना तक पहुंच को अलग-अलग धागे द्वारा संसाधित नहीं किया जा सकता है।

16

इसे सिंक्रनाइज़ किए जाने वाले सभी तरीकों की योग्यता के द्वारा "थ्रेड-सुरक्षित" बनाया गया है (सिंक्रनाइज़ किए गए कीवर्ड के माध्यम से), OpenJDK source code देखें।

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

ध्यान दें कि यह वास्तव में बहुत मदद नहीं करता है, क्योंकि यह वेक्टर की असंगत आंतरिक स्थिति को रोकता है, लेकिन यह उच्च स्तर पर एक स्थिरता के स्तर की गारंटी नहीं देता है (एक आवेदन के लिए एक उपयोगी स्तर)।

// BROKEN CODE, needs external synchronization 
// only add an element if the vector is empty 
if(vector.isEmpty()) 
    vector.add(anElement); 
+0

+1 लेकिन आपको सही करना चाहिए "सिंक्रनाइज़ किए गए कीवर्ड क्या करता है यह एक ही समय में विधि को निष्पादित करने से एक से अधिक धागे को रोकता है"। यह केवल उस विशिष्ट विधि तक पहुंच नहीं है जो अवरुद्ध है। – Fredrik

+0

@ फ्र्रेडिक: धन्यवाद। मैंने वाक्य को ठीक करने के बिना वाक्य को ठीक करने की कोशिश की। मुझे लगता है कि एक लंबे स्पष्टीकरण के लिए एक लिंक क्रम में होगा। – Thilo

+0

क्या मुझे यह सही लगता है, कि आपके द्वारा प्रदान किए गए कोड में 'वेक्टर' को 'vector.add (anElement) से पहले बदल दिया जा सकता था (खाली नहीं हो सकता था;'? – soshial

0

कृपया जावा एपीआई से नीचे अंश लगता है:

इस उदाहरण से पता चलता है कि आप अभी भी अपने आवेदन कोड में तुल्यकालन उपयोग करने के लिए (ताकि आप बस के रूप में अच्छी तरह से इस्तेमाल हो सकता है अनसिंक्रनाइज़्ड ArrayList) की जरूरत पर विचार करें

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

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

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