जावा ऑब्जेक्ट के लिए बताने का कोई तरीका है, जो थ्रेड (या नल) वर्तमान में इसके मॉनीटर का मालिक है? या कम से कम एक तरीका यह बताने के लिए कि क्या मौजूदा धागे का मालिक है?निर्धारित करें कि कौन सा धागा मॉनीटर का मालिक है
उत्तर
मुझे कुछ जवाब मिल गए हैं। परीक्षण करने के लिए कि क्या मौजूदा थ्रेड मॉनिटर रखता है, Thread.holdsLock
मौजूद है!
if (!Thread.holdsLock(data)) {
throw new RuntimeException(); // complain
}
यह वास्तव में तेज़ (उप-माइक्रोसॉन्ड) है और 1.4 के बाद से उपलब्ध है।
सामान्य रूप से परीक्षण करने के लिए, कौन सा थ्रेड (या थ्रेड आईडी) लॉक रखता है, java.lang.management
कक्षाओं (धन्यवाद @amicngh) के साथ ऐसा करना संभव है।
public static long getMonitorOwner(Object obj) {
if (Thread.holdsLock(obj)) return Thread.currentThread().getId();
for (java.lang.management.ThreadInfo ti :
java.lang.management.ManagementFactory.getThreadMXBean()
.dumpAllThreads(true, false)) {
for (java.lang.management.MonitorInfo mi : ti.getLockedMonitors()) {
if (mi.getIdentityHashCode() == System.identityHashCode(obj)) {
return ti.getThreadId();
}
}
}
return 0;
}
इस के साथ कुछ चेतावनियां नहीं है:
- यह थोड़ा धीमा (~ साढ़े मेरे मामले में मिलीसेकंड और शायद धागे की संख्या के साथ रैखिक बढ़ जाती है) है।
- इसके लिए जावा 1.6 और एक वीएम की आवश्यकता है जिसके लिए
ThreadMXBean.isObjectMonitorUsageSupported()
सत्य है, इसलिए यह कम पोर्टेबल है। - इसे "मॉनीटर" सुरक्षा अनुमति की आवश्यकता है, इसलिए संभावित रूप से एक सैंडबॉक्स वाले एप्लेट से काम नहीं करेगा।
- थ्रेड आईडी को थ्रेड ऑब्जेक्ट में बदलना, यदि आपको आवश्यकता है, तो थोड़ा गैर-तुच्छ है, क्योंकि मुझे लगता है कि आपको थ्रेड.इन्यूमेरेट का उपयोग करना होगा और फिर यह पता लगाने के लिए कि किसके पास आईडी है, लेकिन लूप इसमें सैद्धांतिक दौड़ की स्थिति है क्योंकि जब तक आप गणना करते हैं, तब तक यह धागा मौजूद नहीं हो सकता है, या एक नया धागा दिखाई दे सकता है जिसमें एक ही आईडी है।
लेकिन यदि आप केवल वर्तमान धागे का परीक्षण करना चाहते हैं, तो Thread.holdsLock
बहुत अच्छा काम करता है! अन्यथा, java.util.concurrent.locks.Lock
के कार्यान्वयन सामान्य जावा मॉनीटर (धन्यवाद @ user1252434) से अधिक जानकारी और लचीलापन प्रदान कर सकते हैं।
जावा क्लास मॉनीटर जेवीएम के लिए आंतरिक है और आप वास्तव में इसके साथ नहीं खेल सकते हैं।
यदि आप जानते हैं कि ऑब्जेक्ट लॉक है, तो आप मॉनिटर को फिर से प्राप्त करने का प्रयास कर सकते हैं - अगर आप इसे प्राप्त कर सकते हैं, तो इसका मतलब है कि आप ऑब्जेक्ट को अपने थ्रेड से लॉक कर रहे हैं (क्योंकि जावा लॉक रिकर्सिव हैं - आप लॉक कर सकते हैं एक ही धागे से दो बार)। समस्या यह है कि आप सिंक्रनाइज़ करने के लिए को आजमा सकते हैं।
आप असुर ऑब्जेक्ट का उपयोग कर सकते हैं। असुरक्षित में tryMonintorEnter()
विधि है जो बस यही करती है। unsafe देखें।
असुरक्षित वास्तव में मदद करने के लिए आप धागा कि मॉनिटर रखती पाने में सक्षम हो सकता है, लेकिन मुझे लगता है कि ऐसा करने के लिए पता नहीं कैसे ...
में जावा 1.6 आप प्रतिबिंब का उपयोग कर सकते यह जानकारी प्राप्त करने ।
ThreadMXBean tBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfo = tBean .getThreadInfo(bean.getAllThreadIds(), true, true);
इसके बजाय synchronized
का उपयोग कर के, आप, ReentrantLock पर एक नज़र डालें करना चाह सकते हैं विशेष रूप से अपने तरीकों getOwner()
और isHeldByCurrentThread()
। हालांकि, इसका उपयोग करने के लिए थोड़ा और अनुशासन होता है, क्योंकि आपको स्पष्ट रूप से unlock()
होना चाहिए, प्राथमिक रूप से finally
ब्लॉक में।
मैं RentrantLock से परिचित नहीं था। हालांकि यह मेरा सवाल नहीं था, मुझे लगता है कि यह मेरे उपयोग के मामले में वास्तव में बेहतर है, क्योंकि मैं कक्षा सी में लॉकिंग कर सकता हूं और कॉल के बीच लॉक को बनाए रख सकता हूं। बहुत बहुत धन्यवाद। – Boann
यदि आप चाहें तो आप अपना लॉकिंग तर्क रख सकते हैं। ReentrantLock का उपयोग करने के लिए एकमात्र आवश्यक परिवर्तन 'सिंक्रनाइज़ (myLock) {..} 'myLock.lock() से है; {..} अंत में {myLock.unlock();} 'कोशिश करें। हालांकि, सिंक्रनाइज़ करने के विपरीत लॉक केवल कोई ऑब्जेक्ट नहीं हो सकता है। – user1252434
- 1. निर्धारित करें कि कौन सा कंप्यूटर
- 2. यह पता लगाने के लिए कि कौन सा धागा मॉनीटर रखता है?
- 3. कौन सा धागा जागृत करता है?
- 4. कौन सा धागा लॉक मिलेगा?
- 5. कौन सा धागा ContentProvider चलाता है?
- 6. निर्धारित करें कि कौन सा नियंत्रण माउस पॉइंटर
- 7. .NET CompileAssemblyFromSource: निर्धारित करें कि कौन सा स्रोत विफल हुआ?
- 8. निर्धारित करें कि कौन सा तत्व नॉकआउटज ऑब्जर्वेबलएरे
- 9. सुरक्षा का मालिक कौन है?
- 10. जेवीएम का मालिक कौन है?
- 11. निर्धारित कौन सा JTable सेल
- 12. निर्भरता इंजेक्शन - इंटरफ़ेस का मालिक कौन है?
- 13. सी # - धारावाहिक बंदरगाह से कौन सा धागा पढ़ता है?
- 14. नोडजेस कॉलबैक तंत्र - कौन सा धागा कॉलबैक को संभालता है?
- 15. जांचें कि कौन सा तत्व jQuery
- 16. निर्धारित करें कि कौन सा दृश्य वर्तमान में टच किया गया है जबकि उपयोगकर्ता उंगली
- 17. निर्धारित करें कि w3wp.exe प्रक्रिया Windows 7/IIS7.5 में कौन सा ऐप पूल से संबंधित है?
- 18. एंड्रॉइड छवि बटन - यह निर्धारित करें कि वर्तमान में कौन सा संसाधन सेट किया गया है
- 19. आईओएस: क्या यह निर्धारित करने का कोई तरीका है कि प्रेषक कौन सा UIControlEvent आया था?
- 20. टेबलमोडेल बनाम कॉलम मॉडल: कॉलम मान का मालिक कौन है?
- 21. कौन सा खिड़की है सक्रिय
- 22. कौन सा कंपाइलर निर्धारित करता है एक Win32 पीई
- 23. कौन सा आईपीसी यहां अधिक कुशल है?
- 24. निर्धारित करें कि जीसी
- 25. जेनकिंस कैसे निर्धारित करता है कि कौन सा स्थानीय भंडार उपयोग करना है?
- 26. कक्षा रचनाकार और कीवर्ड तर्क - पाइथन कैसे निर्धारित करता है कि कौन सा अप्रत्याशित है?
- 27. निर्धारित करें कि कौन सा शेयर एक्सटेंशन इस्तेमाल किया गया था
- 28. निर्धारित करें कि मानचित्र में कौन सा क्षेत्र (छवि मैप) जावास्क्रिप्ट (या jQuery)
- 29. निर्धारित करें कि कौन सा माउस क्लिक किया गया था (एकाधिक चूहे डिवाइस) .NET
- 30. प्रोग्रामेटिक रूप से निर्धारित करता है कि कौन सा जावा थ्रेड लॉक रखता है
आप इस जानकारी को पाने के लिए थ्रेड डंप कर सकते हैं – fge