दिलचस्प पोस्ट
JQuery के साथ ईवेंट हैंडलर्स के लिए बाध्य कार्यों को एक्सेस करना जावा जेनेरिक आदिम प्रकारों का समर्थन क्यों नहीं करते? प्रतिक्रिया / जेएसएक्स गतिशील घटक नाम सीएसएस ऊंचाई के बीच अंतर: 100% बनाम ऊंचाई: ऑटो HTTP टेस्ट सर्वर जो प्राप्त / पोस्ट कॉल स्वीकार करता है MySQL में एपॉस्ट्रॉफी (') कैसे बचें? वैश्विक कनेक्शन के लिए या सिंगलटन? पुस्तकालयों के साथ मेकफाइल बनाना XML फ़ाइलों के साथ इकाई फ़्रेमवर्क एक SMTP सर्वर से PHP के साथ ईमेल भेजना जावा में स्थिर तरीके कैसे काम करता है? घोंसले के ब्लॉक स्तर तत्व <p> टैग … सही या गलत? PHP: एक श्रेणी के लिए एक सरणी बनाएँ अंतर (फ़ंक्शन () {}) (); और फ़ंक्शन () {} (); क्या अस्थिर महंगा है?

थ्रेड सेफ़ सिंगलटन क्लास

मैंने सिंगलटन क्लास के नीचे लिखा था। मुझे यकीन नहीं है कि यह धागा सुरक्षित एकलटन वर्ग है या नहीं?

public class CassandraAstyanaxConnection { private static CassandraAstyanaxConnection _instance; private AstyanaxContext<Keyspace> context; private Keyspace keyspace; private ColumnFamily<String, String> emp_cf; public static synchronized CassandraAstyanaxConnection getInstance() { if (_instance == null) { _instance = new CassandraAstyanaxConnection(); } return _instance; } /** * Creating Cassandra connection using Astyanax client * */ private CassandraAstyanaxConnection() { context = new AstyanaxContext.Builder() .forCluster(ModelConstants.CLUSTER) .forKeyspace(ModelConstants.KEYSPACE) .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) ) .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") .setPort(9160) .setMaxConnsPerHost(1) .setSeeds("127.0.0.1:9160") ) .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() .setCqlVersion("3.0.0") .setTargetCassandraVersion("1.2")) .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) .buildKeyspace(ThriftFamilyFactory.getInstance()); context.start(); keyspace = context.getEntity(); emp_cf = ColumnFamily.newColumnFamily( ModelConstants.COLUMN_FAMILY, StringSerializer.get(), StringSerializer.get()); } /** * returns the keyspace * * @return */ public Keyspace getKeyspace() { return keyspace; } public ColumnFamily<String, String> getEmp_cf() { return emp_cf; } } 

क्या कोई मुझे इस बारे में सहायता कर सकता है? मेरे ऊपर सिंगलटन क्लास पर कोई विचार बहुत मददगार होगा।

नवीनीकृत कोड: –

मैं अपने कोड में बोहेमियन सुझाव को शामिल करने की कोशिश कर रहा हूं। यहाँ अद्यतन कोड है, मुझे मिला-

 public class CassandraAstyanaxConnection { private static class ConnectionHolder { static final CassandraAstyanaxConnection connection = new CassandraAstyanaxConnection(); } public static CassandraAstyanaxConnection getInstance() { return ConnectionHolder.connection; } /** * Creating Cassandra connection using Astyanax client * */ private CassandraAstyanaxConnection() { context = new AstyanaxContext.Builder() .forCluster(ModelConstants.CLUSTER) .forKeyspace(ModelConstants.KEYSPACE) .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) ) .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") .setPort(9160) .setMaxConnsPerHost(1) .setSeeds("127.0.0.1:9160") ) .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() .setCqlVersion("3.0.0") .setTargetCassandraVersion("1.2")) .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) .buildKeyspace(ThriftFamilyFactory.getInstance()); context.start(); keyspace = context.getEntity(); emp_cf = ColumnFamily.newColumnFamily( ModelConstants.COLUMN_FAMILY, StringSerializer.get(), StringSerializer.get()); } /** * returns the keyspace * * @return */ public Keyspace getKeyspace() { return keyspace; } public ColumnFamily<String, String> getEmp_cf() { return emp_cf; } } 

क्या कोई एक बार देख सकता है और मुझे बता सकता है कि इस बार मुझे यह सही है या नहीं?

सहायता के लिए धन्यवाद।

वेब के समाधान से एकत्रित समाधान "थ्रेड सेफ़ सिंगलटन क्लास"

आप आलसी आरंभीकरण पद्धति को लागू कर रहे हैं – जहां पहली बार उपयोग किए जाने पर उदाहरण बनाया गया है।

लेकिन एक सरल चाल है जो आपको एक थ्रेसेफ कार्यान्वयन कोड को सिंक्रनाइज़ेशन की आवश्यकता नहीं है! इसे प्रारंभिक-मांग-धारक मुहावरों के रूप में जाना जाता है, और यह इस तरह दिखता है:

 public class CassandraAstyanaxConnection { private CassandraAstyanaxConnection(){ } private static class Holder { private static final CassandraAstyanaxConnection INSTANCE = new CassandraAstyanaxConnection(); } public static CassandraAstyanaxConnection getInstance() { return Holder.INSTANCE; } // rest of class omitted } 

यह कोड getInstance() की पहली कॉलिंग के उदाहरण को प्रारंभ करता है, और महत्वपूर्ण रूप से क्लास लोडर के अनुबंध के कारण सिंक्रनाइज़ेशन की आवश्यकता नहीं है:

  • क्लास लोडर क्लासेस लोड करता है जब वे पहली बार एक्सेस किए जाते हैं (इस मामले में Holder की पहुंच केवल getInstance() विधि के भीतर getInstance() )
  • जब कोई वर्ग लोड होता है, और इससे पहले कि कोई भी इसका उपयोग कर सकता है, तो सभी स्थिर प्रारंभिक निष्पादित होने की गारंटी दी जाती है (ऐसा तब होता है जब Holder के स्थैतिक ब्लॉक की आग)
  • क्लास लोडर की अपनी सिंक्रनाइज़ेशन सही में निर्मित होती है, जो कि ऊपर दिए गए दो बिंदुओं को थ्रेसेफ होने की गारंटी देते हैं

यह एक साफ छोटी चाल है जिसका उपयोग मैं जब भी आलसी आरम्भिकरण की आवश्यकता करता हूं। आप final उदाहरण का बोनस भी प्राप्त कर सकते हैं, भले ही यह आलसी बनाया गया हो यह भी ध्यान रखें कि कोड कितना साफ और सरल है

संपादित करें: आपको सभी कन्स्ट्रक्टर को निजी या संरक्षित के रूप में सेट करना चाहिए। सेटिंग और खाली निजी कन्स्ट्रक्टर काम करेंगे

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

 public class MySinglton { private MySinglton (){} private static volatile MySinglton s; public static MySinglton getInstance(){ if (s != null ) return s; synchronized(MySinglton.class){ if (s == null ) { s = new MySinglton(); } } return s; } } 

नहीं, यह धागा-सुरक्षित नहीं है यदि मूल्यों को लुगदी तरीकों पर लौटा दिया गया है, तो परिवर्तनशील वस्तुएं हैं

इस वर्ग के लिए थ्रेड-सुरक्षित एक तरीका यह है कि वह अस्थायी हो।

ऐसा करने के लिए, आप इस तरह से इस पद्धति को बदल सकते हैं:

 public Keyspace getKeyspace() { // make a copy to prevent external user to modified or ensure that Keyspace is immutable, in that case, you don't have to make a copy return new Keyspace( keyspace ); } public ColumnFamily<String, String> getEmp_cf() { // Same principle here. If ColumnFamily is immutable, you don't have to make a copy. If its not, then make a copy return new ColumnFamily( emp_cf ); } 

इस पुस्तक में जावा संगतता अभ्यास में आप उस अपरिवर्तनीयता के सिद्धांत को देख सकते हैं।

नहीं, ये थ्रेड सुरक्षित नहीं दिखता है ऐसा प्रतीत होता है कि आपके पास कॉल करने के बाद कॉल करने के बाद पहुंच योग्य डाटा उपलब्ध है, जहां ताला जारी हो गया होता।

इस महान लेख में यहाँ उल्लेख के रूप में:

एक स्थिर क्षेत्र का उपयोग करने के लिए इस समस्या का सबसे अच्छा समाधान […] है

 public class Singelton { private static final Singelton singleObject = new Singelton(); public Singelton getInstance(){ return singleObject; } } 

मुझे लगता है कि यह हर बार उदाहरण के लिए बिना जाँच के समान काम करेगा स्थिर पहली बार जांच के समान है

 public class Singl { private static Singl _instance; //other vars static{ //synchronized(Singl.class){//do not need _instance = new Singl(); //} } public static Singl getInstance() { return _instance; } private Singl(){ //initizlize } }