2012-05-21 62 views
9

मैं समझता हूं कि Thread.currentThread().yield() थ्रेड शेड्यूलर के लिए एक अधिसूचना है कि यह सीपीयू चक्र को उसी प्राथमिकता के किसी अन्य थ्रेड को असाइन कर सकता है यदि कोई ऐसा मौजूद है। मेरा प्रश्न है: यदि वर्तमान थ्रेड को किसी ऑब्जेक्ट पर लॉक हो गया है और yield() पर कॉल करता है, तो क्या यह तुरंत उस लॉक को खो देगा? और जब थ्रेड शेड्यूलर को पता चलता है कि सीपीयू चक्र को आवंटित करने के लिए ऐसा कोई धागा नहीं है, तो yield() नामक थ्रेड फिर से उस ऑब्जेक्ट पर लॉक करने के लिए लड़ाई में होगा जो पहले खो गया है ??क्या थ्रेड.इल्ड() सिंक्रनाइज़ विधि के अंदर बुलाए जाने पर ऑब्जेक्ट पर लॉक खो देता है?

मुझे इसे जावाडोक और फ़ोरम में नहीं मिला [http://www.coderanch.com/t/226223/java-programmer-SCJP/certification/does-sleep-yield-release-lock] में 50- 50 जवाब

मुझे लगता है कि yield() (चलो थ्रेड 1) लॉक जारी करना चाहिए क्योंकि अगर कुछ थ्रेड (थ्रेड 2 कहें) समान प्राथमिकता पर काम करना चाहता है, तो यह मौका हो सकता है जब थ्रेड शेड्यूलर अंततः थ्रेड 2 को कप असाइन करता है।

उत्तर

14

सं। Thread.yield()Object.wait() जैसा नहीं है। यह थ्रेड स्विच की अनुमति देने के लिए बस नियंत्रण देता है। इसका आपके कार्यक्रम की सहमति पर कोई असर नहीं पड़ेगा।

कोई गारंटी नहीं है कि शेड्यूलर उपज के बाद दौड़ जाएगा।

+2

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

+1

@edalorzo सहमत हुए। यह व्यर्थ है। लॉक का दावा केवल विनम्रतापूर्वक अन्य धागे को स्थगित करने के लिए क्यों करें? – EJP

+0

यह वास्तव में आपके आवेदन पर निर्भर करता है, लेकिन सामान्य, उपज में() आवश्यक नहीं है। मेरा मतलब है, अगर वहाँ ताला में एक और धागा के लिए आवश्यक काम था, तो यह किया जाना है करने के लिए जा रहा है। –

7

Java Language specification
17,3 नींद और यील्ड
में यह ध्यान रखें कि न Thread.Sleep है और न ही किसी भी Thread.yield तुल्यकालन अर्थ विज्ञान है महत्वपूर्ण है। विशेष रूप से, कंपाइलर को Thread.sleep या Thread.yield पर कॉल करने से पहले साझा स्मृति में रजिस्टरों में कैश किए गए लिखने की आवश्यकता नहीं होती है, न ही संकलक को Thread.sleep या थ्रेड पर कॉल करने के बाद रजिस्टरों में कैश किए गए मानों को फिर से लोड करना पड़ता है ।प्राप्ति।

मेरे टिप्पणी:

जावा के शुरुआती दिनों में, जब यह वास्तव में समानांतर फांसी, लेकिन केवल समवर्ती (हरा धागे) समर्थित नहीं था, yield() वर्तमान धागा निलंबित किया गया था, और JVM के लिए एक और धागा उठा था बायोडाटा। अब-दिन, yield का अधिक अर्थ नहीं है क्योंकि आमतौर पर ट्रेड शेड्यूलिंग ओएस स्तर पर होती है।

तो, yield सिर्फ जेवीएम के लिए एक संकेत है कि वर्तमान धागा आराम करना चाहता है और कुछ भी नहीं, यह तय करने के लिए थ्रेड शेड्यूलर पर निर्भर है कि क्या करना है। yield में कोई सिंक्रनाइज़ेशन अर्थपूर्ण नहीं है। अगर थ्रेड लॉक रखता है, तो यह इसे जारी रखेगा।

+0

मैं वर्तमान में अपने एससीजेपी 1.6 पर काम कर रहा हूं और प्रमाणीकरण के लिए आवश्यक परीक्षण किया है जहां एक उपज कॉल है सिंक्रनाइज़ फ़ंक्शन और यह किसी अन्य थ्रेड पर निष्पादन उत्पन्न करता है। – Salsero69

+0

@ ओपी डी सर्कल धन्यवाद! शामिल होने के बारे में क्या? यह भी वैसे ही व्यवहार करता है? –

0

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