2013-02-15 42 views
5

मैं जावा में सेमफोरस में जा रहा हूं और इस लेख को http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html पढ़ रहा था। एकमात्र चीज जो मुझे नहीं मिलती है वह है कि अधिग्रहण() विधि को सिंक्रनाइज़ संदर्भ में उपयोग नहीं किया जाता है। ऊपर webiste से उदाहरण को देखते:सेमफोरस में अधिग्रहण() विधि को सिंक्रनाइज़ क्यों नहीं किया जाना चाहिए?

वे एक सेमाफोर बनाएँ:

private Semaphore semaphore = new Semaphore(100); 

और सिर्फ इस तरह एक परमिट प्राप्त:

semaphore.acquire(); 

अब, नहीं यह संभव होगा कि दो या अधिक धागे एक ही समय में() हासिल करने का प्रयास करते हैं? यदि हां, तो गिनती के साथ थोड़ी सी समस्या होगी।

या, सेमफोर स्वयं सिंक्रनाइज़ेशन को संभालता है?

उत्तर

3

या, सेमफोर स्वयं सिंक्रनाइज़ेशन को संभालता है?

हां मूल रूप से यह है। पूर्व (जैसे रिलीज के रूप में एक "रिलीज" विधि बुला) इस तरह के अधिग्रहण के रूप में एक सफल "अधिग्रहण" पद्धति का अनुसरण हो-से पहले कार्रवाई करने के लिए एक सूत्र में क्रियाएँ:

मेमोरी स्थिरता प्रभाव: संकेतबाहु धागा सुरक्षित रूप the javadoc में विस्तार से बताया हैं() एक और धागे में।

java.util.concurrent पैकेज में ऑब्जेक्ट्स पर अधिकांश ऑपरेशन थ्रेड सुरक्षित हैं। अधिक जानकारी package javadoc के बहुत नीचे प्रदान की जाती है।

3

सेमफोरों को तेज़ होना चाहिए और इसलिए जैसे Unsafe कक्षा से परमाणु समवर्ती प्राइमेटिव का उपयोग करना चाहिए।

इन प्राइमेटिव सिंक्रनाइज़ेशन के साथ बहुत कम स्तर पर होता है और मॉनीटर की आवश्यकता नहीं होती है। (लॉक-फ्री सिंक्रनाइज़ेशन)।

वास्तव में सिंक्रनाइज़ेशन एक लूप द्वारा लगातार सीएएस का उपयोग करके किया जाता है जब तक कि अपेक्षित मान लिखित/पढ़े गए मान के बराबर न हो।

0

तुल्यकालन कैस संचालन के साथ AbstractQueuedSynchronizer द्वारा गारंटीकृत है

javadoc यहाँ

देखना