2011-03-30 17 views
6

सिंक्रनाइज़ करने के लिए अन्य तरीका सिंक्रनाइज़ किए गए कीवर्ड का उपयोग करने के अलावा जावा में विधि सिंक्रनाइज़ कैसे करें?विधि

+6

आप एक और समाधान क्यों ढूंढ रहे हैं? – MeBigFatGuy

+0

iam वैकल्पिक (इसकी सीखने का हिस्सा) की तलाश में है – developer

+0

जब आप किसी विधि पर सिंक्रनाइज़ करते हैं, तो वह ऑब्जेक्ट जिसे आप विधि को लॉक नहीं करते हैं। –

उत्तर

6

आप java.util.concurrent.locks पैकेज इस्तेमाल कर सकते हैं:

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

here देखें।

2

आपको ठोस आवश्यकताओं पर निर्भर करता है।

उच्च स्तर सिंक्रनाइज़ेशन abstractions के लिए Java concurrent package देखें। ध्यान दें कि वे अभी भी synchronized का उपयोग कर सकते हैं ...

1

यह निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। क्या आप जिज्ञासा से बाहर हैं या क्या कोई विशिष्ट कारण है?

यदि आप अपनी बहु-थ्रेडेड विधियों को तेज़ करने की कोशिश कर रहे हैं, तो विशिष्ट अनुभागों के आसपास सिंक्रनाइज़ करने या लॉक करने का प्रयास करें, या थ्रेडिंग समस्याओं को पूरी तरह से टालना; , साझा डेटा final, स्थिर (गैर साझा) डेटा ThreadLocal बनाने बनाने के लिए, java.util.concurrent.atomic से परमाणु प्रकार का उपयोग, (java.util.concurrent संकुल से) समवर्ती संग्रह का उपयोग आदि

Btw, java.util.concurrent सामान के बाद Java5 में ही उपलब्ध है, हालांकि वहाँ के रूप में एक परियोजना जावा 1.4 के लिए बंदरगाह वापस करने के लिए संकुल http://backport-jsr166.sourceforge.net/

पर मैं किताब 'अभ्यास में जावा संगामिति' ब्रायन गोएज़ द्वारा सलाह देते हैं।

1

आप @SynchronizedProject Lombok से भी एक निजी क्षेत्र उत्पन्न करने के लिए उपयोग कर सकते हैं जो आपकी विधि के लिए लॉक के रूप में उपयोग किया जाएगा।

0

आप अपनी विधि के अंदर एक सिंक्रनाइज़ ब्लॉक का उपयोग कर सकते हैं। यह उपयोगी हो सकता है यदि आप एक ही कक्षा से संबंधित दो विधियों को अलग से सिंक्रनाइज़ करने के लिए चाहते हैं।

private Object guard = new ... 
public method(){ 
    synchronized(guard){ 
     \\method body 
     ... 
    } 
} 

हालांकि ज्यादातर मामलों में यह पता चलता है कि तुम सच में अपने वर्ग को तोड़ने चाहिए।

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