java - कैसे जावा के साथ सिंक्रनाइज़ेशन उल्लंघन का पता लगा सकता है




multithreading synchronization (6)

आप एक दृष्टिकोण में दिलचस्पी ले सकते हैं, पीटर वेवरजर ने ब्लॉग के बारे में बताया है, जिस पर वह संगामी डिटेक्टर कहता है। मुझे विश्वास नहीं है कि उसने अभी तक इसे खुले-खुले रखा है, लेकिन जैसा कि वह इसका वर्णन करता है, मूल विचार एओपी को लिखत के कोड का उपयोग करना है, जिसे आप प्रोफ़ाइल में रूचि रखते हैं, और यह रिकॉर्ड रिकॉर्ड करते हैं कि किस फ़ील्ड को छुआ है। इसके बाद यह मैन्युअल रूप से या स्वचालित रूप से जनरेटेड लॉग को पार्स करने की बात है।

मैं सोच रहा हूं कि सिंक्रनाइज़ेशन या कुछ चीज़ों के बारे में दावा करने के तरीके क्या हैं, ताकि मैं सिंक्रनाइज़ेशन उल्लंघन (परीक्षण के दौरान) का पता लगा सके।

इसका उपयोग उदाहरण के लिए किया जाएगा कि मेरे पास एक ऐसा वर्ग होगा जो धागा-सुरक्षित नहीं है और यह धागा-सुरक्षित होने वाला नहीं है किसी तरह से मुझे कुछ तर्क होगा जो मुझे सूचित करेगा (लॉग या कुछ) अगर इसके कुछ तरीके एकाधिक थ्रेड से बुलाए गए थे।

मैं कुछ इसी तरह की लालसा कर रहा हूं जो निम्नलिखित के साथ एडब्ल्यूटी प्रेषण धागा के लिए बनाया जा सकता है:

public static void checkDispatchThread() {
    if(!SwingUtilities.isEventDispatchThread()) {
        throw new RuntimeException("GUI change made outside AWT dispatch thread");
    }
}

मैं केवल कुछ और सामान्य चाहता हूं समस्या का वर्णन इतना स्पष्ट नहीं है, लेकिन मुझे आशा है कि किसी के पास कुछ अच्छे दृष्टिकोण हैं =)



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

उसने कहा, उपयोग के मामले से जो आप का वर्णन करते हैं, यह एक धागा को याद करने के रूप में सरल रूप से कुछ की तरह लगता है और उस पर दावा करने से आपकी ज़रूरतों के लिए पर्याप्त हो सकता है

class Foo {

  private final Thread owner = Thread.currentThread();

  void x() {
    assert Thread.currentThread() == owner;
    /* Implement method. */
  }

}

मालिक का संदर्भ अभी भी तब आबादी है जब दावा अक्षम हो जाता है, इसलिए यह पूरी तरह से "मुफ़्त" नहीं है मैं भी इस बॉयलरप्लेट के साथ मेरी कई कक्षाओं को अव्यवस्था नहीं देना चाहता था

Thread.holdsLock (ऑब्जेक्ट) विधि भी आपके लिए उपयोगी हो सकती है


विशिष्ट उदाहरण के लिए आप दे सकते हैं, स्विंगलैब के पास कुछ सहायक कोड है, जो घटना थ्रेड के उल्लंघन का पता लगाता है और लटका हुआ है। https://swinghelper.dev.java.net/

कुछ समय पहले, मैंने जेपीरोब जावा प्रफाइलिंग टूल के साथ काम किया था। उनके एक उपकरण (थ्रेडलिज़र?) थ्रेड सिंक उल्लंघन के लिए देखा गया अपने वेब पेज को देखते हुए, मुझे उस नाम का एक उपकरण नहीं दिखाई देता है या मुझे याद है। लेकिन आप एक नज़र रखना चाहते हैं http://www.quest.com/jprobe/performance-home.aspx


IntelliJ IDEA में कई उपयोगी संगामिति निरीक्षण हैं । उदाहरण के लिए, यह आपको चेतावनी देता है कि जब आप समान ऑब्जेक्ट को सिंक्रनाइज़ और अनसिंक्रनाइज़ किए गए दोनों संदर्भों से एक्सेस कर रहे हैं, जब आप गैर-अंतिम ऑब्जेक्ट्स और अधिक पर सिंक्रनाइज़ कर रहे हैं

इसी तरह, FindBugs कई समान चेक है


आप पवित्र कंघी बनानेवाले की रेती के लिए देख रहे हैं, मुझे लगता है AFAIK यह मौजूद नहीं है, और जावा ऐसी भाषा नहीं है जो इस तरह के दृष्टिकोण को आसानी से बनाए जाने की अनुमति देता है

थ्रेडिंग समस्याओं के परीक्षण के लिए "अभ्यास में जावा संगतता" का एक खंड है। यह विशेष ध्यान देता है कि यह करना कितना कठिन है।





error-detection