/ / जावा सिंगलटन पैटर्न में सिंक्रनाइज़ करें - जावा, सिंक्रनाइज़ेशन, सिंगलटन

जावा सिंगलटन पैटर्न - जावा, सिंक्रनाइज़ेशन, सिंगलटन में सिंक्रनाइज़ करें

सिंक्रनाइज़ कीवर्ड को कक्षा के प्रत्येक विधि पर लागू करने की आवश्यकता होती है जो इस तरह सिंगलटन पैटर्न लागू करता है?

public class Singleton {

private Singleton(){}

public synchronized static Singleton getInstance()
{
if(instance == null)
instance = new Singleton ();

return instance;
}

public void DoA(){
}
}

चूंकि सिंगलेट्स जनता को बेनकाब नहीं करते हैंकन्स्ट्रक्टर और getInstance () विधि सिंक्रनाइज़ होती है, किसी को सिंगलटन क्लास द्वारा प्रकट विधि डीओए और किसी अन्य सार्वजनिक विधियों को सिंक्रनाइज़ करने की आवश्यकता नहीं होती है।

क्या यह तर्क सही है?

उत्तर:

उत्तर № 1 के लिए 17

यह किसी भी अन्य वर्ग की तरह है। इसे और सिंक्रनाइज़ेशन की आवश्यकता नहीं हो सकती है।

निम्नलिखित उदाहरण पर विचार करें:

public class Singleton {

private Singleton() {}

public synchronized static Singleton getInstance() { ... }

private int counter = 0;

public void addToCounter(int val) {
counter += val;
}
}

यदि कक्षा को कई धागे से इस्तेमाल किया जाना है, addToCounter() एक दौड़ की स्थिति है। इसे ठीक करने का एक तरीका है addToCounter() सिंक्रनाइज़:

  public synchronized void addToCounter(int val) {
count += val;
}

दौड़ की स्थिति को ठीक करने के अन्य तरीके हैं, उदाहरण के लिए उपयोग करके AtomicInteger:

  private final AtomicInteger counter = new AtomicInteger(0);

public void addToCounter(int val) {
counter.addAndGet(val);
}

यहां, हमने उपयोग किए बिना दौड़ की स्थिति तय की है synchronized.


जवाब के लिए 9 № 2

खैर, सिंगलटन वर्ग का उद्देश्य यह है कि इसमें से एक उदाहरण है और सभी थ्रेड उसी ऑब्जेक्ट तक पहुंच सकते हैं।

यदि आप सिंक्रनाइज़ नहीं करेंगे getInstance निम्नलिखित विधि हो सकती है

थ्रेड 1 प्रवेश करता है getInstance()

थ्रेड 2 प्रवेश करता है getInstance()

थ्रेड 1 मूल्यांकन करता है instance == null सेवा मेरे true

थ्रेड 2 मूल्यांकन करता है instance == null सेवा मेरे true

थ्रेड 1 असाइन करता है instance और रिटर्न

Thread2 फिर सेप्रदान करती है instance = new Singleton() और रिटर्न।

अब धागे दोनों में सिंगलटन वर्ग का एक अंतर उदाहरण है जो इस पैटर्न द्वारा रोका जाना चाहिए था।

सिंक्रनाइज़ करना रोकता है कि दोनों थ्रेड एक ही समय में कोड के उसी ब्लॉक तक पहुंच सकते हैं। इसलिए जब आप सिंगलटन कक्षाओं को तुरंत चालू करते हैं तो एक बहुप्रचारित वातावरण में सिंक्रनाइज़ेशन की आवश्यकता होती है।

अब यह मानते हुए कि कई धागे प्रयास करेंगेसिंगलटन विधियों तक पहुंचने के लिए एक ही समय में उन विधियों पर सिंक्रनाइज़ेशन भी आवश्यक हो सकता है। विशेष रूप से यदि वे केवल इसे पढ़ने के बजाय डेटा बदलते हैं तो यह सच है।


उत्तर № 3 के लिए 1

सिंगलटन का उपयोग करने के लिए सही (सर्वश्रेष्ठ वास्तव में) तरीका

private static singleton getInstance() {
if (minstance == null) {
synchronized (singleton.class) {
if (minstance == null) {
minstance = new singleton();
}
}
}
return minstance;
}

उत्तर के लिए 1 № 4

आलसी प्रारंभिक और धागा सुरक्षित समाधान:

public class Singleton {

public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}

public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}