"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > सेमाफोर का उपयोग करके जावा में समवर्ती प्रबंधन की तकनीकें

सेमाफोर का उपयोग करके जावा में समवर्ती प्रबंधन की तकनीकें

2024-11-09 को प्रकाशित
ब्राउज़ करें:459

1. जावा में सेमाफोर क्या है?

Techniques for Managing Concurrency in Java Using Semaphores

जावा में एक सेमाफोर एक सिंक्रनाइज़ेशन सहायता है जो किसी भी समय किसी साझा संसाधन तक पहुंचने वाले थ्रेड्स की संख्या को प्रतिबंधित करता है। यह java.util.concurrent पैकेज का हिस्सा है और इसका उपयोग फ़ाइलों, डेटाबेस या नेटवर्क कनेक्शन जैसे संसाधनों तक समवर्ती पहुंच को प्रबंधित करने के लिए किया जाता है।

1.1 सेमाफोर कैसे काम करता है?

Techniques for Managing Concurrency in Java Using Semaphores

एक सेमाफोर परमिट की एक निर्धारित संख्या तक पहुंच को नियंत्रित करता है। प्रत्येक परमिट किसी विशेष संसाधन तक पहुँचने के अधिकार का प्रतिनिधित्व करता है। सेमाफोर उपलब्ध परमिटों की संख्या पर नज़र रखता है, जो यह निर्धारित करता है कि कितने थ्रेड एक साथ संसाधन तक पहुंच सकते हैं।

परमिट: एक टोकन या टिकट जो किसी थ्रेड को साझा संसाधन तक पहुंचने के साथ आगे बढ़ने की अनुमति देता है।

जब आप एक सेमाफोर बनाते हैं, तो आप उपलब्ध परमिटों की संख्या निर्दिष्ट करते हैं। यह संख्या परिभाषित करती है कि कितने थ्रेड एक साथ संसाधन तक पहुंच सकते हैं।

इससे पहले कि कोई थ्रेड संसाधन तक पहुंच सके, उसे सेमाफोर से परमिट प्राप्त करना होगा। यह acquire() विधि का उपयोग करके किया जाता है।

अधिग्रहण : यह विधि तब कॉल की जाती है जब कोई थ्रेड संसाधन तक पहुंचना चाहता है। यदि कोई परमिट उपलब्ध है, तो सेमाफोर उपलब्ध परमिटों की संख्या कम कर देता है और थ्रेड को आगे बढ़ने की अनुमति देता है। यदि कोई परमिट उपलब्ध नहीं है, तो परमिट उपलब्ध होने तक थ्रेड को ब्लॉक कर दिया जाता है।

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

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

रिलीज़ : यह विधि उपलब्ध परमिटों की संख्या बढ़ाती है। यदि कोई थ्रेड परमिट की प्रतीक्षा कर रहा है, तो उनमें से एक को अनब्लॉक कर दिया जाएगा और परमिट प्राप्त करने की अनुमति दी जाएगी।

1.2 सेमाफोर के प्रकार

जावा में दो प्रकार के सेमाफोर हैं:

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

2. जावा में सेमाफोर लागू करना

सेमाफोर कैसे काम करते हैं, इसे बेहतर ढंग से समझने के लिए, आइए एक व्यावहारिक कार्यान्वयन पर नजर डालें। हम एक सरल परिदृश्य बनाएंगे जहां एकाधिक थ्रेड सीमित संसाधन तक पहुंचने का प्रयास करेंगे।

2.1 पर्यावरण की स्थापना

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    // Creating a semaphore with 3 permits
    private static final Semaphore semaphore = new Semaphore(3);

    public static void main(String[] args) {
        // Creating and starting 6 threads
        for (int i = 1; i 



2.2 संहिता की व्याख्या

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

2.3 आउटपुट का अवलोकन करना

जब आप उपरोक्त कोड चलाएंगे, तो आउटपुट कुछ इस तरह दिखेगा:

Worker 1 is trying to acquire a permit...
Worker 1 acquired a permit.
Worker 2 is trying to acquire a permit...
Worker 2 acquired a permit.
Worker 3 is trying to acquire a permit...
Worker 3 acquired a permit.
Worker 4 is trying to acquire a permit...
Worker 5 is trying to acquire a permit...
Worker 6 is trying to acquire a permit...
Worker 1 is releasing a permit.
Worker 4 acquired a permit.
Worker 2 is releasing a permit.
Worker 5 acquired a permit.
Worker 3 is releasing a permit.
Worker 6 acquired a permit.

यहां, पहले तीन थ्रेड सफलतापूर्वक परमिट प्राप्त करते हैं और अपना कार्य शुरू करते हैं। शेष थ्रेड्स को आगे बढ़ने से पहले परमिट जारी होने तक इंतजार करना होगा।

2.4 व्यावहारिक उपयोग के मामले

सेमाफोर उन परिदृश्यों में विशेष रूप से उपयोगी होते हैं जहां आपको किसी विशेष संसाधन तक समवर्ती पहुंच की संख्या को सीमित करने की आवश्यकता होती है, जैसे:

  • डेटाबेस कनेक्शन सीमित करना
  • साझा फ़ाइल तक पहुंच को नियंत्रित करना
  • सर्वर में नेटवर्क कनेक्शन प्रबंधित करना

3. सेमाफोर का उपयोग करने के फायदे और नुकसान

हालांकि सेमाफोर एक शक्तिशाली उपकरण हैं, वे अपने फायदे और नुकसान के साथ आते हैं।

3.1 लाभ

लचीलापन : सेमाफोर एकाधिक थ्रेड द्वारा संसाधन पहुंच पर सटीक नियंत्रण की अनुमति देता है।

स्केलेबिलिटी : सेमाफोर आसानी से बड़ी संख्या में संसाधनों तक पहुंच का प्रबंधन कर सकता है।

निष्पक्षता : यह सुनिश्चित करने के लिए कि थ्रेड निष्पक्ष तरीके से परमिट प्राप्त करते हैं, सेमाफोर को कॉन्फ़िगर किया जा सकता है।

3.2 नुकसान

जटिलता : सेमाफोर का उपयोग करने से आपके कोड में जटिलता आ सकती है, जिससे इसे डीबग करना कठिन हो जाता है।

गतिरोध : यदि सही ढंग से नहीं संभाला जाता है, तो सेमाफोर गतिरोध का कारण बन सकता है जहां थ्रेड्स परमिट के इंतजार में अनिश्चित काल तक अवरुद्ध हो जाते हैं।

4. जावा में सेमाफोर का उपयोग करने के लिए सर्वोत्तम अभ्यास

सामान्य नुकसान से बचने और सेमाफोर का अधिकतम लाभ उठाने के लिए, निम्नलिखित सर्वोत्तम प्रथाओं पर विचार करें:

4.1 समय-सीमित अधिग्रहण के लिए ट्राइएक्वायर का उपयोग करें

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

if(semaphore.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
    try {
        // Critical section
    } finally {
        semaphore.release();
    }
}

4.2 हमेशा अंततः ब्लॉक में परमिट जारी करें

संसाधन लीक से बचने के लिए, परमिट को हमेशा अंततः ब्लॉक में जारी करें। यह सुनिश्चित करता है कि अपवाद होने पर भी परमिट जारी किया जाता है।

4.3 साधारण तालों के लिए सेमाफोर का उपयोग करने से बचें

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

5। उपसंहार

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

यदि आपके कोई प्रश्न हैं या आप सेमाफोर्स के साथ अपने अनुभव साझा करना चाहते हैं, तो बेझिझक नीचे टिप्पणी करें!

यहां अधिक पोस्ट पढ़ें: सेमाफोर का उपयोग करके जावा में कॉन्करेंसी प्रबंधित करने की तकनीक

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/anh_trntun_4732cf3d299/techniques-for-manating-concurrency-in-java-using-semapores-5ai?1 यदि कोई उल्लंघन है, तो कृपया हटाने के लिए स्टडी_गोलंग@163.com से संपर्क करें। यह
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3