2013-10-17 5 views
8

अंतर बी/डब्ल्यू आंतरिक लॉकिंग क्या है, क्लाइंट साइड लॉकिंग & बाह्य लॉकिंग?अंतर बी/डब्ल्यू आंतरिक लॉकिंग, क्लाइंट साइड लॉकिंग और बाहरी लॉकिंग?

थ्रेड सुरक्षित वर्ग बनाने का सबसे अच्छा तरीका क्या है?

ताला किस तरह की & क्यों पसंद है?

+0

की [ "निजी फाइनल के उपयोग क्या है संभव डुप्लिकेट ऑब्जेक्ट "जावा मल्टीथ्रेडिंग में लॉकिंग?] (Http://stackoverflow.com/questions/19419702/what-is-the-use-of-private-final-object-locking-in-java-multithreading) – Dirk

+0

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

उत्तर

1

ये कुछ लिंक है कि विभिन्न ताला योजनाओं पर चर्चा कर रहे हैं:

Explicit versus Intrinsic

Client side locking and when to avoid it

मैं, है कि वहाँ एक "सर्वश्रेष्ठ" एक धागा सुरक्षित वर्ग बनाने के लिए जिस तरह से नहीं जानता कि यह इस बात पर निर्भर करता है कि आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं। आम तौर पर आपको पूरे वर्ग धागे को सुरक्षित करने की ज़रूरत नहीं होती है, केवल उन संसाधनों की रक्षा करें जिनके पास सभी अलग-अलग धागे हैं, जैसे कि सामान्य सूचियां आदि।

2

स्पष्टीकरण - लॉक इंटरफेस जैसे समवर्ती लॉक उपयोगिताओं का उपयोग करके लॉकिंग। जैसे - ConcurrentHashMap

आंतरिक - synchronized का उपयोग कर ताला लगा।

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

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

public static Object getLast(Vector list) { 
    synchronized (list) { 
     int lastIndex = list.size() - 1; 
     return list.get(lastIndex); 
    } 
} 

public static void deleteLast(Vector list) { 
    synchronized (list) { 
     int lastIndex = list.size() - 1; 
     list.remove(lastIndex); 
    } 
} 
6

का उदाहरण मैं तुम्हें पढ़ने के लिए "Java Concurrency In Practice" ब्रायन गोएज़ द्वारा अत्यधिक की सिफारिश करेंगे है। यह एक उत्कृष्ट किताब है जो आपको समेकन के बारे में सभी अवधारणाओं को समझने में मदद करेगी!

आपके प्रश्नों के बारे में, मुझे यकीन है कि अगर मैं उन सब को जवाब कर सकते हैं नहीं कर रहा हूँ, लेकिन मैं इसे एक कोशिश दे सकते हैं। ज्यादातर बार, यदि प्रश्न "लॉक करने का सबसे अच्छा तरीका क्या है" आदि, तो जवाब हमेशा यह निर्भर करता है कि आप किस समस्या को हल करने का प्रयास करते हैं।

प्रश्न 1:

क्या तुम यहाँ तुलना करने की कोशिश बिल्कुल तुलनीय नहीं हैं;

जावा, synchronized ब्लॉक एक लॉक करने के लिए तंत्र में बनाया जा सकता है। प्रत्येक वस्तु सिंक्रनाइज़ेशन के प्रयोजनों के लिए पूरी तरह से ताला के रूप में कार्य कर सकती है; इन अंतर्निर्मित ताले को आंतरिक ताले कहा जाता है।

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

क्लाइंट साइड लॉकिंग, अगर मैं समझता हूं कि आपका क्या मतलब है, तो कुछ अलग है। जब आपके पास थ्रेड सेफ क्लास नहीं है, तो आपके ग्राहकों को इसकी परवाह करने की आवश्यकता है। उन्हें ताले रखने की जरूरत है ताकि वे सुनिश्चित कर सकें कि कोई दौड़ की स्थिति नहीं है।

बाह्य ताला लगा बजाय सिंक्रनाइज़ ब्लॉक जो आप अंतर्निहित ताले विशेष रूप से स्पष्ट ताले उपयोग करने के लिए देता है के तंत्र में बनाया का उपयोग कर के, है। यह लॉकिंग का एक और अधिक परिष्कृत तरीका है। कई फायदे हैं (उदाहरण के लिए आप प्राथमिकताओं को सेट कर सकते हैं)। एक अच्छा प्रारंभिक बिंदु java documentation about locks

प्रश्न 2: यह निर्भर करता है :) मेरे लिए सबसे आसान सब कुछ अपरिवर्तनीय रखने की कोशिश की जाती है। जब कुछ अपरिवर्तनीय है, मैं अब और

प्रश्न धागा सुरक्षा के बारे में देखभाल करने के लिए की जरूरत नहीं है 3: मैं एक तरह से अपने पहले प्रश्न पर यह जवाब

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