2012-07-22 20 views
12

पर सिंक्रनाइज़ बनाम पुनर्वित्त लॉक एक मल्टीथ्रेडिंग सिस्टम के लिए क्यूई कार्यान्वयन की बात आती है जब मैं कुछ आश्चर्यों के एक सेट के माध्यम से रहा हूं। यहां है: -प्रदर्शन

परिदृश्य: - 1 निर्माता, 1 उपभोक्ता: - एक निर्माता एक कतार में एक पूर्णांक रखता है। एक उपभोक्ता बस इसे कतार से हटा देता है।

कतार के अंतर्निहित डेटा संरचना: - TreeSet (जो मैं कभी नहीं सोचा था कि मैं का उपयोग करेगा), LinkedList, (अनिश्चितकालीन आकार के साथ)

कोड LinkedBlockingQueue: - एक कतार के रूप में TreeSet की: -

while (i < 2000000) { 
     synchronized (objQueue) { 

      if (!(objQueue.size() > 0)) { 
       try { 
        objQueue.wait(); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      Integer x = objQueue.first(); 
      if (x != null) { 
       objQueue.remove(x); 
       ++i; 
      } 
     } 
    } 

संपादित करें: -

 while (i < 2000000) { 
     synchronized (objQueue) { 
      objQueue.add(i); 
      ++i; 
      objQueue.notify(); 
     } 
    } 

LinkedBlockingQueue के लिए: -

 while (i < 2000000){ 
     try { 
      objQueue.put(i); 
      ++i; 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      Thread.currentThread().interrupt(); 
     } 
    } 

     while (i < 2000000) { 
     try { 
      objQueue.take(); 
      ++i; 

     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      Thread.currentThread().interrupt(); 
     } 
    } 

लिंक्डलिस्ट के लिए: - सिंक्रनाइज़ किए गए समान कोड।

प्रश्न: -

1) जब मैं दृश्य वी एम के माध्यम से प्रदर्शन मापा जाता है, मैंने देखा कि निर्माता कोड के लिए, TreeSet LinkedBlockingQueue और LinkedList तुलना में बेहतर प्रदर्शन, भले ही यह हे लेता है (लॉग एन) समय , लिंक्ड संरचनाओं में वस्तुओं का निर्माण एक महत्वपूर्ण उपरि है। सिद्धांत इस अभ्यास के लिए काफी अलग क्यों है? हम कतार कार्यान्वयन में वृक्ष संरचनाओं पर लिंक्ड, ऐरे संरचनाओं को क्यों पसंद करते हैं?

2) सिंक्रनाइज़ एक स्पष्ट विजेता के रूप में ReeentrantLock बनाम आता है क्योंकि ट्रीसेट ने लिंक्डलिस्ट से बेहतर प्रदर्शन किया जो LinkedBlockingQueue से बेहतर प्रदर्शन करता है। काश मैं विजुअल वीएम परिणाम संलग्न कर सकता हूं। यह कोर 2 डुओ 2.10 लेख के साथ वोट में नहीं है, http://www.ibm.com/developerworks/java/library/j-jtp10264/index.html

संचालन

Vostro 1015 पर

डेल प्रदर्शन कर रहे हैं, 32 बिट ऑपरेटिंग सिस्टम के साथ 2GB राम और साथ

JVM: जावा हॉटस्पॉट (टीएम) क्लाइंट वी एम (20.1-B02, मिश्रित मोड) जावा: संस्करण 1.6.0_26, विक्रेता सन माइक्रोसिस्टम्स इंक

उत्तर

13

1.ReentrantLock अधिक अगर तुम करने की जरूरत है एक धागा लागू उपयोग करने के लिए उपयुक्त हो सकता है कि एक नयी सूची को घुमाता है, अगले नोड को लॉक करता है और फिर वर्तमान नोड को अनलॉक कर देता है।

2.Synchronized कीवर्ड जैसे ताला coarsening स्थिति में उपयुक्त है, अनुकूली कताई, पक्षपाती लॉकिंग और भागने विश्लेषण के माध्यम से ताला इलिजन के लिए क्षमता प्रदान करता है। उन अनुकूलन वर्तमान में ReentrantLock के लिए लागू नहीं हैं।

एक उचित प्रदर्शन की तुलना के लिए यह देखें:

http://lycog.com/concurency/performance-reentrantlock-synchronized/

+0

यह लगभग वही उदाहरण है जिसके लिए मैंने अपने प्रश्न में एक लिंक संलग्न किया है। यह मुझे बताता है कि आरईएल का प्रदर्शन 2 धागे से शुरू सिंक्रनाइज़ करने से बेहतर है। मुझे यह भी लगता है कि अगर मैं सभी उपलब्ध CPUs पर थ्रेड चलाने के लिए ओएस शेड्यूलर को मजबूर करने का कोई तरीका प्राप्त करता हूं, तो निश्चित रूप से हम निश्चित रूप से LinkedBlockingQueues के लिए बेहतर प्रदर्शन प्राप्त करेंगे। अगर आपको मेरे अवलोकन डेटा की ज़रूरत है तो मुझे बताएं। – 100pipers

+2

कुमार यह उल्लेख करना भूल गया कि उसने [डेविड डाइस के वेबलॉग] से अपना जवाब लिया (https://blogs.oracle.com/dave/entry/java_util_concurrent_reentrantlock_vs)। –

+0

@AlexanderRyzhov मुझे इस आलेख के मूल लेखक को इंगित करने के लिए धन्यवाद, क्योंकि मैंने इसे पढ़ा था जबकि मैं अपने ब्लॉग के लिए अन्य ब्लॉग से तैयारी कर रहा था ... बहुत बहुत धन्यवाद –

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

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

+0

के लिए है, मैं असहमत हूं कि निर्णय मानदंड प्रदर्शन पर विचार नहीं करना चाहिए। समाधान को सही ढंग से काम करने के लिए एक सामान्य दृष्टिकोण होगा, फिर प्रदर्शन पर विचार करें। लेकिन पहले से विचार करने में बिल्कुल कुछ भी गलत नहीं है, क्योंकि यह संभवतः समय लेने वाली रिफैक्टरिंग को बचाने में मदद कर सकता है। – Brady

+0

@ जेबी निजेट: - मेरे कोड में क्या बग है? मेरे पास इसी तरह की समझ है कि फीफो के लिए, मुझे ट्रीसेट का उपयोग नहीं करना चाहिए, लेकिन मुझे कारण बताएं कि ट्रीसेट की विधि विधि लिंक्डलिस्ट की अतिरिक्त विधि से बहुत तेज है (क्योंकि ऑब्जेक्ट निर्माण का समय ऊंचा है), क्यों नहीं होगा क्या मैं ट्रीसेट का उपयोग नहीं करता (हालांकि लिंक्डलिस्ट के मामले में हटाने बहुत तेज है)? वास्तविक समय व्यापार अनुप्रयोगों के लिए, केवल प्रदर्शन मायने रखता है। तो कहानी का क्रूक्स यह है कि मैं क्यूई के लिए बेहतर डीएस का उपयोग करना चाहता हूं और मैं सिंक्रनाइज़ पर आरईएल का उपयोग करना चाहता हूं। – 100pipers

+1

@ ब्रैडी निश्चित रूप से, एक बेवकूफ डिजाइन के साथ शुरू न करें जो स्पष्ट रूप से बुरी तरह प्रदर्शन करेगा, लेकिन आपको प्रदर्शन हंच के आधार पर एक विशिष्ट कार्यान्वयन नहीं चुनना चाहिए। वह विकल्प चुनें जो आपके आवेदन की ज़रूरतों को सबसे अच्छी तरह फिट करता है और आपके पास कम बग्स होंगे। यदि और केवल तभी प्रदर्शन * समस्या * बन जाता है, तो कार्यान्वयन को स्वैप करके इसे सुधारने के तरीकों की तलाश करें। – Bohemian

संबंधित मुद्दे