दिलचस्प पोस्ट
कैसे PHP का उपयोग कर एक यादृच्छिक स्ट्रिंग बनाने के लिए? ब्राउज़र बैक बटन हैंडलिंग जुड़ा हुआ नोड के ग्राफ़ का प्रतिनिधित्व करने वाले पेड़ को कैसे खींचना है? सशर्त शामिल होने के साथ ईएफ प्रश्न पासवर्ड इनपुट के बाद चमकदार ऐप प्रारंभ करना तत्वों के केन्द्रित ग्रिड में वाम संरेखित पिछली पंक्ति फोर्स आर को घातीय अंकन (जैसे ई + 10) का उपयोग नहीं करने के लिए? स्क्रैप वेब पृष्ठ सामग्री स्मृति के साथ एक समारोह का निर्माण करने का सबसे अच्छा तरीका यह पता कैसे करें कि आप $ _SERVER के बिना HTTPS का उपयोग कर रहे हैं पायथन त्रुटि "आयात इर्रर: कोई मॉड्यूल नाम नहीं" एंड्रॉइड टाइमर? कैसे? यह Google Play APK क्या त्रुटि संदेश का अर्थ प्रकाशित करता है? कैसे मोबाइल सफारी में आईफ्रेम को ठीक से प्रदर्शित करने के लिए दूसरे के बाद एक को निष्पादित करने के लिए मैं 3 कार्यों को कैसे कॉल करूँ?

जावा में स्थिर तरीके कैसे काम करता है?

अगर मेरे पास एक स्थिर वर्ग है जो बुनियादी डेटा एक्सेस को पूरा करने के लिए हाइबरनेट फ़ंक्शन को बुलाएगा। मैं सोच रहा हूं कि विधि को synchronized करने के लिए धागा-सुरक्षा सुनिश्चित करने के लिए सही दृष्टिकोण है।

मैं चाहता हूं कि यह जानकारी की पहुंच को उसी डीबी उदाहरण से रोकने के लिए करे। हालांकि, अब मुझे यकीन है कि यदि निम्नलिखित कोड getObjectById को सभी वर्गों के लिए बुलाया जा रहा है, जब इसे किसी विशेष वर्ग द्वारा कहा जाता है

 public class Utils { public static synchronized Object getObjectById (Class objclass, Long id) { // call hibernate class Session session = new Configuration().configure().buildSessionFactory().openSession(); Object obj = session.load(objclass, id); session.close(); return obj; } // other static methods } 

वेब के समाधान से एकत्रित समाधान "जावा में स्थिर तरीके कैसे काम करता है?"

एक स्थिर विधि लॉक पर सिंक्रनाइज़ का उपयोग करके आप क्लास विधियों और विशेषताओं को सिंक्रनाइज़ करेंगे (उदाहरण विधियों और विशेषताओं के विपरीत)

तो आपकी धारणा सही है।

मैं सोच रहा हूं कि विधि को सिंक्रनाइज़ करने के लिए धागा-सुरक्षा सुनिश्चित करने के लिए सही दृष्टिकोण है।

ज़रुरी नहीं। आपको उस काम को इसके बजाय RDBMS करना चाहिए। वे इस तरह के सामानों में अच्छे हैं

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

निम्न परिदृश्य की कल्पना करें:

तालिका ए के रिकॉर्ड एक्स में अलग-अलग जानकारी डालने के लिए क्लाइंट ए और बी का प्रयास

आपके दृष्टिकोण के साथ ही आप जो कुछ भी प्राप्त कर रहे हैं, यह सुनिश्चित करना है कि किसी को दूसरे के बाद कहा जाता है, जब यह डीबी में किसी भी तरह होता है, क्योंकि आरडीबीएमएस उन्हें आधे से आधे सूचनाएं आधे से एक ही समय से सम्मिलित करने से रोकेगी । परिणाम समान होगा, लेकिन केवल 5 गुना (या अधिक) धीमा हो जाएगा

शायद हाइबरनेट दस्तावेज़ में "लेनदेन और संगामिति" अध्याय पर एक नज़र रखना बेहतर हो सकता है अधिकांश समय समस्याओं को हल करने की कोशिश कर रहे हैं, पहले से हल किया गया है और एक बेहतर तरीका है।

प्रश्न को अधिक आम तौर पर संबोधित करने के लिए …

ध्यान रखें कि तरीकों पर सिंक्रनाइज़ करने का उपयोग वास्तव में सिर्फ लघुकथ (मान है कि वर्ग कुछ क्लास है):

 synchronized static void foo() { ... } 

के समान है

 static void foo() { synchronized(SomeClass.class) { ... } } 

तथा

 synchronized void foo() { ... } 

के समान है

 void foo() { synchronized(this) { ... } } 

आप लॉक के रूप में किसी भी वस्तु का उपयोग कर सकते हैं। यदि आप स्थैतिक विधियों के सबसेट लॉक करना चाहते हैं, तो आप कर सकते हैं

 class SomeClass { private static final Object LOCK_1 = new Object() {}; private static final Object LOCK_2 = new Object() {}; static void foo() { synchronized(LOCK_1) {...} } static void fee() { synchronized(LOCK_1) {...} } static void fie() { synchronized(LOCK_2) {...} } static void fo() { synchronized(LOCK_2) {...} } } 

(गैर-स्थैतिक तरीकों के लिए, आप लॉक को गैर-स्थिर फ़ील्ड बनाना चाहते हैं)

स्थैतिक तरीके लॉकिंग के लिए ऑब्जेक्ट के रूप में क्लास का उपयोग करते हैं, जो आपके उदाहरण के लिए Utils.class है। तो हां, यह ठीक है।

static synchronized मतलब क्लास के Class ऑब्जेक्ट पर लॉक रखने के लिए जहां synchronized अर्थ उस क्लास के ऑब्जेक्ट पर लॉक रखने वाला है। इसका अर्थ है, यदि आप किसी थ्रेड (निष्पादन के) में एक गैर-स्थिर सिंक्रनाइज़ किए गए विधि तक पहुंच रहे हैं, तो आप अब भी एक अन्य धागे का उपयोग कर एक स्थिर सिंक्रनाइज़ विधि का उपयोग कर सकते हैं।

इसलिए, धागा से अधिक किसी भी समय दो तरह के तरीकों (या तो दो स्थिर या दो गैर-स्थिर तरीकों) तक पहुँचने संभव नहीं है।

आप यह क्यों लागू करना चाहते हैं कि केवल एक धागा किसी एक समय में डीबी तक पहुंच सकता है?

यह किसी भी आवश्यक लॉक को लागू करने के लिए डेटाबेस ड्राइवर का काम है , यह मानते हुए कि Connection केवल एक धागे द्वारा एक समय में उपयोग किया जाता है!

सबसे अधिक संभावना है, आपके डेटाबेस में एकाधिक, समानांतर पहुंच को संभालने में पूरी तरह से सक्षम है

यदि यह आपके डेटाबेस में डेटा के साथ कुछ है, तो क्यों नहीं प्राप्त करने के लिए डेटाबेस अलगाव लॉकिंग का उपयोग करें?

आपके प्रश्न का उत्तर देने के लिए, यह ऐसा करता है: आपकी synchronized विधि एक समय में एक से अधिक धागे द्वारा निष्पादित नहीं की जा सकती।