उदाहरण के लिए, यहां एक वर्ग A, FunciontionInterface f= A::new है, तो मैं अलग-अलग धागे में f() को कॉल करता हूं, क्या यह थ्रेड सुरक्षित है?

नोट: यह का डुप्लिकेट प्रश्न नहीं है। जावा में विधि पैरामीटर थ्रेड सुरक्षित के रूप में । इसके अलावा, मैं वस्तुओं की निर्माता विधि पूछ रहा हूं, न कि उपयोगकर्ता द्वारा परिभाषित विधि।

1
scottxiao 9 मई 2020, 09:49
निश्चित रूप से, विधि संदर्भ केवल वस्तुएं हैं, वे किसी विशिष्ट धागे से बंधे नहीं हैं। और कंस्ट्रक्टर स्वयं थ्रेड-सुरक्षित हैं क्योंकि आप एक ही ऑब्जेक्ट इंस्टेंस के निर्माण के लिए कभी भी कंस्ट्रक्टर को दो बार कॉल नहीं कर सकते।
 – 
user207421
9 मई 2020, 09:51
मैं कंस्ट्रक्टर को दो बार क्यों नहीं बुला सकता? मैं इसे एक ही समय में अलग-अलग थ्रेड में कॉल कर सकता हूं।
 – 
scottxiao
9 मई 2020, 09:55
आप इसे दो बार कॉल कर सकते हैं लेकिन आप दो अलग-अलग वस्तुओं का निर्माण करेंगे, एक ही वस्तु का नहीं। आपको स्थिर सदस्यों के लिए सिंक्रनाइज़ेशन के बारे में चिंता करनी पड़ सकती है लेकिन उदाहरण के सदस्यों के लिए नहीं। जब तक this कंस्ट्रक्टर से बच न जाए।
 – 
user207421
9 मई 2020, 09:56
आप वस्तु निर्माण को A a = (new A).A(); के रूप में समझ सकते हैं।
 – 
user207421
9 मई 2020, 10:01
1
क्या आप समझा सकते हैं कि थ्रेड सुरक्षा के संदर्भ में आप क्या मानते हैं? अगर सवाल सिर्फ इतना ही सामान्य है तो मुझे लगता है कि @ user207421 ने कहा है कि कहने के लिए सब कुछ है।
 – 
akuzminykh
9 मई 2020, 10:09

2 जवाब

विधि संदर्भ सिर्फ वाक्य रचनात्मक चीनी हैं। विधि संदर्भों की थ्रेड सुरक्षा (इस मामले में कंस्ट्रक्टर संदर्भ) इस तथ्य पर उबलती है कि यदि कंस्ट्रक्टर स्वयं थ्रेड सुरक्षित है। उदाहरण के लिए, जब कंस्ट्रक्टर थ्रेड सुरक्षित नहीं हैं, तो स्थितियाँ हैं:

  • उचित तुल्यकालन तंत्र के बिना एक कंस्ट्रक्टर के भीतर से static चर को संशोधित करना
  • ऑब्जेक्ट के पूरी तरह से इनिशियलाइज़ होने से पहले कंस्ट्रक्टर के भीतर से this रेफरेंस को पब्लिश करना और अन्य थ्रेड्स द्वारा एक्सेस किया जा सकता है।

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

3
michalk 9 मई 2020, 10:31

एक विधि संदर्भ एक मान है। यह न तो थ्रेड-सुरक्षित है और न ही थ्रेड-सुरक्षित है। हम जितना कह सकते हैं, उससे कहीं अधिक मूल्य 3.14159 थ्रेड-सुरक्षित है या थ्रेड-सुरक्षित नहीं है।

यदि आप एक साझा चर में एक विधि संदर्भ डालते हैं, तो थ्रेड-सुरक्षा इस बात पर निर्भर करती है कि साझा चर का उपयोग कैसे किया जाता है। किसी भी अन्य चर की तरह।

यदि आप एक विधि संदर्भ का आह्वान (कॉल) करते हैं तो थ्रेड-सुरक्षा इस बात पर निर्भर करती है कि विधि/निर्माता को कैसे कार्यान्वित किया गया है। कार्यान्वयन थ्रेड सुरक्षित हो सकता है या नहीं।

कंस्ट्रक्टर के गैर-थ्रेड-सुरक्षित होने के संभावित कारण शामिल हैं:

  • सिंक्रनाइज़ेशन के बिना एक साझा स्थिर चर का उपयोग करना
  • this को पूरी तरह से आरंभ करने से पहले प्रकाशित करना (असुरक्षित प्रकाशन)
  • कंस्ट्रक्टर किसी अन्य ऑब्जेक्ट पर एक विधि बुला रहा है जो थ्रेड-सुरक्षित नहीं है।

मैं वस्तुओं की निर्माता विधि पूछ रहा हूं, उपयोगकर्ता द्वारा परिभाषित विधि नहीं।

सामान्य तरीकों और कंस्ट्रक्टर्स में कोई अंतर नहीं है।

ध्यान दें कि डिफ़ॉल्ट नो-आर्ग कंस्ट्रक्टर को छोड़कर, दोनों तरीके और कंस्ट्रक्टर उपयोगकर्ता परिभाषित हैं ... (और यहां तक ​​​​कि बाद वाला भी गैर-थ्रेड-सुरक्षित होगा यदि इसका सुपरक्लास कंस्ट्रक्टर यह थ्रेड-सुरक्षित नहीं है।)

3
Stephen C 9 मई 2020, 12:06