पर सिंक्रनाइज़ बनाम पुनर्वित्त लॉक एक मल्टीथ्रेडिंग सिस्टम के लिए क्यूई कार्यान्वयन की बात आती है जब मैं कुछ आश्चर्यों के एक सेट के माध्यम से रहा हूं। यहां है: -प्रदर्शन
परिदृश्य: - 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, विक्रेता सन माइक्रोसिस्टम्स इंक
यह लगभग वही उदाहरण है जिसके लिए मैंने अपने प्रश्न में एक लिंक संलग्न किया है। यह मुझे बताता है कि आरईएल का प्रदर्शन 2 धागे से शुरू सिंक्रनाइज़ करने से बेहतर है। मुझे यह भी लगता है कि अगर मैं सभी उपलब्ध CPUs पर थ्रेड चलाने के लिए ओएस शेड्यूलर को मजबूर करने का कोई तरीका प्राप्त करता हूं, तो निश्चित रूप से हम निश्चित रूप से LinkedBlockingQueues के लिए बेहतर प्रदर्शन प्राप्त करेंगे। अगर आपको मेरे अवलोकन डेटा की ज़रूरत है तो मुझे बताएं। – 100pipers
कुमार यह उल्लेख करना भूल गया कि उसने [डेविड डाइस के वेबलॉग] से अपना जवाब लिया (https://blogs.oracle.com/dave/entry/java_util_concurrent_reentrantlock_vs)। –
@AlexanderRyzhov मुझे इस आलेख के मूल लेखक को इंगित करने के लिए धन्यवाद, क्योंकि मैंने इसे पढ़ा था जबकि मैं अपने ब्लॉग के लिए अन्य ब्लॉग से तैयारी कर रहा था ... बहुत बहुत धन्यवाद –