2013-01-06 35 views
8

यह वास्तव में स्पष्ट होना चाहिए, लेकिन मैं जवाब नहीं दे सकता। मुझे यह सुनिश्चित करने के लिए एक चर के चारों ओर एक ताला लगाने की जरूरत है कि कुछ दौड़-खतरे की स्थिति से बचा जा सके। मैं क्या देख सकते हैं से, एक बहुत सरल उपाय लॉक का उपयोग मौजूद है, एंड्रॉयड डॉक्स के अनुसार:मैं एंड्रॉइड में लॉक (concurrent.locks.Lock) कैसे बना सकता हूं?

Lock l = ...; 
l.lock(); 
try { 
    // access the resource protected by this lock 
} 
finally { 
    l.unlock(); 
} 

अब तक तो अच्छा। हालांकि, मैं पहली पंक्ति का काम नहीं कर सकता। यह प्रतीत होता है कि कुछ की तरह:

Lock l = new Lock(); 

सही हो सकता है, लेकिन रिपोर्ट ग्रहण, "प्रकार लॉक का दृष्टांत नहीं कर सकते" - और अधिक।

कोई सुझाव?

+2

google: जावा सिंक्रनाइज़ ब्लॉक – Leonidos

उत्तर

11

आप एक Lock के प्रयोग पर बहुत उत्सुक हैं, तो आप एक Lock कार्यान्वयन के रूप में आप यह कर सकते हैं इन्स्तांत इंटरफेस नहीं चयन करने के लिए की जरूरत है।

  • ReentrantLock
  • Condition यह एक ही लॉक बल्कि एक सहायक वर्ग के बाद से Condition रों Lock रों लिए बाध्य कर रहे नहीं है: docs के अनुसार आप 3 विकल्प हैं।
  • ReadWriteLock

आप शायद के साथ संभवतः ReentrantLock के लिए देख रहे कुछ Condition रों

इसका मतलब है कि Lock l = new Lock(); के बजाय आप क्या करेंगे:

ReentrantLock lock = new ReentrantLock(); 

हालांकि, अगर तुम सब ' लॉक करने की आवश्यकता एक छोटा सा हिस्सा है, एक सिंक्रनाइज़ ब्लॉक/विधि क्लीनर है (जैसा कि @Leonidos & @assylias द्वारा सुझाया गया है)।

आप एक विधि है कि मूल्य सेट है, तो आप कर सकते हैं:

public synchronized void setValue (var newValue) 
{ 
    value = newValue; 
} 

या अगर यह एक बड़ा विधि का एक हिस्सा है:

public void doInfinite() 
{ 
    //code 
    synchronized (this) 
    { 
    value = aValue; 
    } 
} 
+0

परिदृश्य को ध्यान में रखते हुए एक सिंक्रनाइज़ ब्लॉक संभवतः पर्याप्त होगा। – assylias

+0

सभी के लिए धन्यवाद, मैं अब आगे बढ़ सकता हूं :-) –

1

सिर्फ इसलिए कि Lock एक अंतरफलक है और तत्काल नहीं किया जा सकता है। इसके उप-वर्गों का प्रयोग करें।