2012-05-13 14 views
12

निम्नलिखित कोड पर विचार करें:एक उदाहरण में जावा दो सिंक्रनाइज़ तरीकों

public class SynchronizedCounter extends Thread { 
    private int c = 0; 

    public synchronized void increment() { 
     c++; 
    } 

    public synchronized void decrement() { 
     c--; 
    } 

    public void run() { 
     for(;;) 
      increment(); 
    } 
} 

static void main(String[] args) { 
    SynchronizedCounter counter = new SynchronizedCounter(); 
    counter.start(); 
    for(;;) 
     counter.decrement(); 
} 

इसका मतलब है कि वेतन वृद्धि() और घटती() तरीकों एक दूसरे को खत्म करने के लिए है या नहीं के लिए इंतजार करेंगे करता है?

संपादित करें: और यह प्रतीक्षा नहीं करता है?

synchronized(this) { 
    //... 
} 

तो दोनों तरीकों को प्रभावी ढंग से एक ही म्युटेक्स वस्तु पर ताला लगा रहे हैं:

static void main(String[] args) { 
    SynchronizedCounter counter1 = new SynchronizedCounter(); 
    SynchronizedCounter counter2 = new SynchronizedCounter(); 
    counter1.start(); 
    for(;;) 
     counter2.decrement(); 
} 

उत्तर

13

हाँ, synchronized कीवर्ड के लिए एक आशुलिपि है। यदि आप चाहते हैं कि वे एक दूसरे से स्वतंत्र हों (जो इस उदाहरण में एक बुरा विचार है क्योंकि वे दोनों एक ही मूल्य तक पहुंचते हैं), Object locking private class members - best practice? (Java) देखें।

BTW अपने SynchronizedCounter बल्कि एक Thread विस्तार के बाद से आप इसे अन्य थ्रेड निर्माता के लिए गुजर रहे हैं की तुलना में Runnable को लागू करना चाहिए - अब यह थोड़ा भ्रामक है।

+0

हाँ पर लॉक के बिना एक तुल्यकालन एक से किसी अन्य सिंक्रनाइज़ विधि कह सकते हैं, तो आप विस्तार के बारे में सही कर रहे हैं थ्रेड, बस कोड तय किया :) – MBZ

6

ताला हमेशा पूरे ऑब्जेक्ट पर है। यदि इनमें से कोई भी synchronized सदस्यों का उपयोग किया जाता है।

अपने पहले उदाहरण में, दो धागे हीcounter वस्तु के लिए तर्क (जो अनंत लूप में increment() विधि कॉल) कर रहे हैं, एक आप स्पष्ट रूप से शुरू कर दिया और अन्य धागा मुख्य थ्रेड (जो decrement() कहता है असीम)।

दूसरे उदाहरण में, दो वस्तुओं को counter1 और counter2 बनाया गया है। इनके अपने ताले एक-दूसरे से स्वतंत्र होंगे। एक वस्तु को लॉक करना अन्य धागे को अन्य ऑब्जेक्ट तक पहुंचने से प्रभावित नहीं करता है। दो धागे (स्पष्ट और मुख्य धागा) दो अलग-अलग वस्तुओं पर ताला लगाते हैं और इसलिए में कोई विवाद नहीं है।

1

क्या इसका मतलब यह है कि वृद्धि() और कमी() विधियां एक-दूसरे के लिए खत्म होने की प्रतीक्षा करेंगी या नहीं?

नहीं, इसका मतलब है कि कोई अन्य धागा वेतन वृद्धि() और घटती() कॉल करने के लिए जब एक धागा उनके भीतर है सक्षम हो जाएगा। पूरा होने के लिए, अन्य धागा इस उदाहरण/वस्तु के किसी भी सिंक्रनाइज़ विधि पर अमल नहीं कर सका

आप एक ही उदाहरण/वस्तु