2013-03-01 8 views
11

उदा मैं स्थिर क्षेत्र instance साथ वर्ग Singleton है:सिंगलटन वर्ग

public class Singleton { 

    private static Singleton instance; 

    // other code, construct, getters, no matter  
} 

मैं दो अलग अलग classloaders साथ दो बार इस वर्ग लोड कर सकते हैं। मैं इससे कैसे बच सकता हूं? यह असुरक्षित और खतरनाक है।

इसके अलावा, अगर मैं शून्य को उदाहरण सेट करता हूं, तो क्या यह दोनों कक्षाओं के लिए शून्य हो जाएगा?

Singleton singleton = Singleton.getInstance(); 
singleton = null; 
+2

यदि आप वास्तव में एक सिंगलटन डिज़ाइन पैटर्न प्राप्त करना चाहते हैं, तो जावा में [enum type] (http://en.wikipedia.org/wiki/Singleton_pattern#The_Enum_way) का पालन करें - "* एक एकल-तत्व enum प्रकार है सिंगलटन * " – Lion

+7

लागू करने का सबसे अच्छा तरीका enum पैटर्न प्रति वर्ग लोडर के एक उदाहरण की उपस्थिति को रोक नहीं पाएगा, है ना? – keuleJ

+0

सिंगलेट्स के बारे में: http://weblogs.java.net/blog/kirillcool/archive/2005/08/how_single_is_y.html – keuleJ

उत्तर

24

आप classloaders भर में एक सच्चे Singleton चाहते हैं, तो आप प्रश्न में वर्ग लोड करने के लिए एक आम माता-पिता की जरूरत है, या आप classloader खुद को निर्दिष्ट करने की जरूरत है।

अद्यतन: नीचे दिए गए ब्लॉग में सामग्री के एक उचित बिट के नीचे @Pshemo से टिप्पणी से नीचे JavaWorld Article से सीधे आ सकता है। मैंने ब्लॉग प्रविष्टि को छोड़ दिया है क्योंकि यह अभी भी किसी की मदद कर सकता है, लेकिन यह जानने के लायक है कि मूल रूप से सामग्री कहां से आई थी।

मूल: एक blog प्रविष्टि है कि आप ऐसा करने के लिए "(! हालांकि मैं इसे करने की कोशिश नहीं की है) एक रास्ता देती है, और यह काफी उचित लग रहा है

से यहाँ नीचे एक कोड स्निपेट का अनुरोध किया जैसा कि मेरे ऊपर दी गई लिंक - मेरा सुझाव है कि आप पूरे संदर्भ के लिए ब्लॉग पर हालांकि:

private static Class getClass(String classname) throws ClassNotFoundException { 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    if(classLoader == null) 
     classLoader = Singleton.class.getClassLoader(); 
     return (classLoader.loadClass(classname)); 
} 
+1

अच्छा जवाब! यदि आप लिंक किए गए आलेख को क्रेडिट के साथ यहां समाधान का कोड उदाहरण शामिल करते हैं तो यह बेहतर होगा। –

+0

कृपया, कोड उदाहरण शामिल करें। अनुरोध के रूप में – bsiamionau

+0

कोड स्निपेट :-) –

0

यह एक तथ्य यह है कि हैक Properties फैली Map, एक पुराने दुर्भाग्यपूर्ण डिजाइन निर्णय का दुरुपयोग

012।
public final class JvmWideSingleton 
{ 
    private static final JvmWideSingleton INSTANCE; 

    static { 
     // There should be just one system class loader object in the whole JVM. 
     synchronized(ClassLoader.getSystemClassLoader()) { 
      Properties sysProps = System.getProperties(); 
      // The key is a String, because the .class object would be different across classloaders. 
      JvmWideSingleton singleton = (JvmWideSingleton) sysProps.get(JvmWideSingleton.class.getName()); 

      // Some other class loader loaded JvmWideSingleton earlier. 
      if (singleton != null) { 
       INSTANCE = singleton; 
      } 
      else { 
       // Otherwise this classloader is the first one, let's create a singleton. 
       // Make sure not to do any locking within this. 
       INSTANCE = new JvmWideSingleton(); 
       System.getProperties().put(JvmWideSingleton.class.getName(), INSTANCE); 
      } 
     } 
    } 

    public static JvmWideSingleton getSingleton() { 
     return INSTANCE; 
    } 
} 

इसे पैरामीट्रिज्ड बनाया जा सकता है, लेकिन फिर प्रारंभिक आलसी होगा और getSingleton() पर जायेगा।

PropertiesHashtable-आधारित है, इसलिए यह थ्रेड सुरक्षित है (दस्तावेज़ीकरण के अनुसार)। तो कोई props.computeIfAbsent() का उपयोग कर सकता है। लेकिन मुझे यह और अधिक पसंद है।

इसके अलावा यहां पढ़ें: Scope of the Java System Properties

मैं सिर्फ यह लिखा था और वहाँ कुछ है कि काम करने से यह रोका जा सके मैं अनदेखी की है एक मौका है।

+0

वहां एक बग ... फिक्सिंग –

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