2011-03-30 14 views
9

अगर मैं एक सिंक्रनाइज़ सार्वजनिक विधि और एक निजी विधि है:समन्वयित तरीके

public synchronized void doSomething() { 
    doSomethingElse() 
} 

private void doSomethingElse() { 
} 

मैं निजी विधि सिंक्रनाइज़ करने के लिए की जरूरत है?

+2

आप जो चाहते हैं उस पर निर्भर करता है, और यदि उन्हें समवर्ती रूप से चलाने की अनुमति दी जानी चाहिए। –

उत्तर

1

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

4

नहीं: यदि एकमात्र तरीका doSomethingElse() कहा जाता है तो सिंक्रनाइज़ किया गया एक और तरीका है।

संभवत: हाँ: आप एक विधि है कि सिंक्रनाइज़ नहीं कर रहा है के माध्यम से कुछ अन्य फैशन में doSomethingElse() फोन, और आप इसे समवर्ती पहुंच रोकने के लिए की जरूरत है।

0

यदि आप कोड के ब्लॉक को सिंक्रनाइज़ करते हैं तो कोड के उस ब्लॉक (उसी धागे पर) से बुलाया गया कुछ भी प्रारंभिक लॉक रखता है। तो सिंक्रनाइज़ ब्लॉक का हिस्सा है जब इसे doSomething से कहा जाता है।

यदि आपने ऐसा किया:

public synchronized void doSomething() { 
    new Thread() { 
    public void run() { 
     doSomethingElse(); 
    } 
    }.start(); 
} 
private void doSomethingElse() { 
} 

फिर doSomethingElse होगा ताला कि doSomething द्वारा अधिग्रहण कर लिया था नहीं है।

सिंक्रनाइज़ किए गए तरीकों से बचें क्योंकि यह आपकी समवर्ती नीति के कार्यान्वयन विवरण का खुलासा करता है। (Avoid synchronized(this) in Java?

तो doSomethingElse सिंक्रनाइज़ किया जाना चाहिए, के चाहे या नहीं यह doSomething से कहा जाता है, भले ही यह doSomethingElse सिंक्रनाइज़ करने के लिए चोट नहीं होगा के रूप में सिंक्रनाइज़ ताले रहे हैं फिर से प्रवेशी: सिंक्रनाइज़ (यह)/सिंक्रनाइज़ तरीकों पर इस सवाल देखें यानी, अगर किसी थ्रेड में ऑब्जेक्ट पर पहले से लॉक है तो यह लॉक फिर से प्राप्त कर सकता है)।

0

व्यक्तिगत रूप से, मुझे सिंक्रनाइज़ किए गए तरीकों को पसंद नहीं है। मैं ताला varaible किसी तरह के साथ सिंक्रनाइज़ करना पसंद करते हैं, के रूप में इतना:

private final Object lock = new Object(); 

public void doSomething() { 
    synchronized(lock) { 
    // Do some safely 
    doSomethingElse(); 
    } 
    // Do some work un-safely 
} 

private void doSomethingElse() { 
    // Do some work safely because still in lock above 
    // ... 
} 
5

यह आप क्या कर रहे हैं पर निर्भर करता है। क्या आपको doSomethingElse() पर धारावाहिक पहुंच सुनिश्चित करने की आवश्यकता है?

यदि ऐसा है, और doSomethingElse() पर कॉल करने वाली एकमात्र चीज doSomething() है, तो नहीं, आपको सिंक्रनाइज़ करने की आवश्यकता नहीं है। लेकिन अगर कोई अन्य विधि doSomethingElse() पर कॉल कर सकती है, तो हाँ, आपको इसे सिंक्रनाइज़ करना चाहिए।

13

यह निर्भर करता है:

  • तो doSomethingElse समवर्ती कॉल करने के लिए है, तो आप synchronized की जरूरत नहीं है सुरक्षित है।
  • यदि ऐसा नहीं है, तो इसका जवाब कहाँ से कहा जाता है पर निर्भर करता है:
    • यह केवल अन्य synchronized तरीकों से कहा जाता है, तो यह synchronized होने की जरूरत नहीं है (लेकिन इस तरह के इच्छा के रूप में यह अंकन नुकसान न करें);
    • यदि इसे उन तरीकों से बुलाया जा सकता है जो synchronized स्वयं नहीं हैं, तो synchronized होना चाहिए।
0

क्या आप किया है ठीक है, मेरी राय में, तुल्यकालन न्यूनतम विवरण के स्तर को संभव में किया जाना चाहिए हालांकि। जो वास्तविक निजी फ़ंक्शन को सिंक्रनाइज़ करने का सुझाव देगा। वर्तमान में, आप मान रहे हैं कि कक्षा में कोई अन्य कार्य निजी समारोह को स्वतंत्र रूप से कॉल नहीं करेगा। यह भविष्य में मामला नहीं हो सकता है।

2

यह @GuardedBy एनोटेशन का इरादा है। आप उम्मीद करते हैं कि जब कि विधि बुला एक ताला चाहिए आयोजित किया हैं, तो यह है कि के साथ उनकी व्याख्या और लॉक (उदाहरण में के नाम पर यह होगा:

@GuardedBy("this") private void doSomethingElse() {…} 

तो फिर तुम देख सकते हैं कि अपरिवर्तनीय सच है FindBugs साथ।

तुम भी धागे की सुरक्षा या इसे की कमी वर्णन करने के लिए इस्तेमाल करते हैं और other net.jcip.annotations FindBugs इन मान्यताओं भी मान्य हो सकता है। बेशक, the book रूप में अच्छी तरह एक प्लग की जरूरत है।

0

यहां तक ​​कि कोड काम करता है, हालांकि सही ढंग से जब निजी विधि सिंक नहीं है hronized, निजी विधि सिंक्रनाइज़ करने के लिए एक रखरखाव परिप्रेक्ष्य से समझदार प्रतीत होता है।

आंतरिक लॉक फिर से प्रवेश कर रहे हैं, सिंक्रनाइज़ किए गए कीवर्ड को निजी विधि में जोड़ने में कोई हानि नहीं है।

किसी निजी विधि में कोड डालने से इसे अन्य तरीकों से बुलाया जा सकता है, इसलिए भविष्य में मामले में निजी विधि सिंक्रनाइज़ करने के लिए यह समझदारी होगी कि इसे किसी अन्य विधि से कहा जाता है जिसे अन्यथा सिंक्रनाइज़ करने की आवश्यकता नहीं होती है।

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