2008-09-08 12 views
37

क्या किसी भी ऑब्जेक्ट के लॉक को पकड़ने वाले थ्रेड के नाम को प्रोग्रामेटिक रूप से जांचने के लिए रनटाइम पर संभव है?प्रोग्रामेटिक रूप से निर्धारित करता है कि कौन सा जावा थ्रेड लॉक रखता है

+1

अपने शीर्षक में बदलाव करके संकेत मिलता है कि आप जावा मतलब पोस्ट करें फिर से। प्रश्न से संबंधित एकमात्र जगह महत्वपूर्ण जानकारी नहीं होनी चाहिए। –

उत्तर

22

आप केवल यह बता सकते हैं कि वर्तमान थ्रेड में सामान्य लॉक है (Thread.holdsLock(Object))। आप धागे का संदर्भ नहीं प्राप्त कर सकते हैं जिसमें मूल कोड के बिना ताला है।

हालांकि, अगर आप थ्रेडिंग के साथ कुछ भी जटिल कर रहे हैं, तो शायद आप java.util.concurrent संकुल से परिचित होना चाहते हैं। ReentrantLock आपको अपने मालिक को प्राप्त करने की अनुमति देता है (लेकिन इसकी एक संरक्षित विधि है, इसलिए आपको इसे विस्तारित करना होगा)। आपके आवेदन के आधार पर, यह हो सकता है कि समवर्ती पैकेज का उपयोग करके, आप पाएंगे कि आपको लॉक के मालिक को सभी के बाद प्राप्त करने की आवश्यकता नहीं है।

लॉक मालिकों को खोजने के लिए गैर-प्रोग्रामेटिक तरीके हैं, जैसे कि थ्रेड डंप को stderr पर जारी करने के लिए JVM को सिग्नल करना, जो डेडलॉक्स के कारण को निर्धारित करने के लिए उपयोगी हैं।

4

रन jconsole। यह जावा एसडीके में शामिल है और कमांड लाइन से चलाया जाता है। मुझे यकीन नहीं है कि आप किस ओएस का उपयोग कर रहे हैं, लेकिन विंडोज़ पर आप इसे जावा प्रक्रिया के पीआईडी ​​पास कर सकते हैं। इससे आपको समस्या का कारण बनने वाले थ्रेड को ढूंढने में मदद करनी चाहिए। या, आप एक वाणिज्यिक प्रोफाइलर जैसे किकिट या किसी अन्य प्रोफाइलर का उपयोग कर सकते हैं।

7

आप 1.6 से कर सकते हैं, जेएमएक्स का उपयोग सभी प्रकार के दिलचस्प चीजों को करने के लिए करते हैं जिसमें आयोजित ताले शामिल हैं। आप वास्तविक वस्तु नहीं प्राप्त कर सकते हैं, लेकिन आपको कक्षा और पहचान हैश मान प्राप्त होता है (जो अद्वितीय नहीं है)।

There's an example in one of my weblogs.

3

1,5 में, आप सभी धागे खोजने के लिए और इस तरह हर एक राज्य है, जैसे प्राप्त कर सकते हैं:

Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces(); 
    for (Map.Entry<Thread, StackTraceElement[]> threadEntry : map.entrySet()) { 
     log.info("Thread:"+threadEntry.getKey().getName()+":"+threadEntry.getKey().getState()); 
     for (StackTraceElement element : threadEntry.getValue()) { 
      log.info("--> "+element); 
     } 
    } 

Thread.getState धागा अवरुद्ध है या नहीं, प्रतीक्षा आदि के बारे में आप जानकारी देता है , jdk api ThreadState

12

आप प्रतिबिंब के साथ धागे द्वारा आयोजित ताले पर जा सकते हैं। यह केवल जावा 1.6 के साथ काम करता है।

ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true); 

इन ThreadInfo वस्तुओं LockInfo वस्तुओं जो आप प्रश्न में ताला की तुलना करने के लिए उन पर identityHashCode उपयोग कर सकते हैं देखते हैं में से प्रत्येक पर।

0

जब आप लॉक लेते हैं तो आप मौजूदा थ्रेड को पकड़ने के लिए एक चर का उपयोग कर सकते हैं, फिर प्रिंट करें यदि कोई और इसका उपयोग करने का प्रयास कर रहा है।

Thread holderOfLock = null; 
Object theLock = new Object(); 

public void doStuff() 
{ 
    if(holderOfLock != null) 
    { 
     //get and print name of holderOfLock-thread or get stacktrace etc. 
    } 

    synchronized (theLock) 
    { 
     holderOfLock = Thread.currentThread(); 
     //do stuff... 
     holderOfLock = null; 
    } 
} 
1

आप wait() या उस वस्तु पर notify() विधि को फोन करके विशेष वस्तु पर ताला देख सकते हैं। यदि ऑब्जेक्ट लॉक नहीं रखता है, तो यह llegalMonitorStateException फेंक देगा।

2- holdsLock(Object o) विधि को कॉल करके। यह बुलियन मूल्य वापस करेगा।

1

अगर यह होता है -entrant ताला यू जांच कर सकते हैं कर सकते हैं अगर यह मौजूदा धागा द्वारा आयोजित किया जाता है

final ReentrantLock lock = new ReentrantLock(); 
lock.isHeldByCurrentThread();