2010-11-27 14 views
7

एक थ्रेड पढ़ने और कुछ धागे लिखने के साथ एक आदिम प्रकार परिवर्तक पर विचार करें, क्या निम्न कोड सही तरीके से काम करेगा?अस्थिर और रीड-राइट लॉक के रूप में सिंक्रनाइज़ किया गया

यदि यह होगा, तो यह 1 से बेहतर प्रदर्शन प्रदान करता है)। सभी विधियों पर सिंक्रनाइज़ घोषित करना; 2)। एक स्पष्ट ReadWriteLock का उपयोग कर?

क्या यह एक आम पैटर्न है? यदि नहीं, तो इस स्थिति में आमतौर पर किस पैटर्न का उपयोग किया जाता है?

यह वर्तमान में मेरे लिए ठीक काम करता है, लेकिन मुझे लगता है कि अस्थिर और सिंक्रनाइज़ दोनों का उपयोग करने के लिए यह थोड़ा अनावश्यक है।

private volatile int value = 1; 

public void func1() 
{ 
    if (value == 1) { 
     // do something 
    } 
} 

public void func2() 
{ 
    if (value == 2) { 
     // do something 
    } 
} 

public void func3() 
{ 
    if (value == 3) { 
     // do something 
    } 
} 

public synchronized void increase() 
{ 
    if (value < 10) value++; 
} 

public synchronized void decrease() 
{ 
    if (value > 0) value--; 
} 

उत्तर

3

बहुत से धागे पढ़ने और कुछ धागे लिखने के साथ एक आदिम प्रकार परिवर्तक पर विचार करें, क्या निम्न कोड सही तरीके से काम करेगा?

मुझे ऐसा लगता है।

यदि यह होगा, तो यह 1 से बेहतर प्रदर्शन प्रदान करता है)। सभी विधियों पर सिंक्रनाइज़ घोषित करना; 2)। एक स्पष्ट ReadWriteLock का उपयोग कर?

मुझे ऐसा लगता है, बशर्ते पढ़े गए ऑपरेशन लिखने के अनुरोधों से अधिक हों। हालांकि:

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

क्या यह एक आम पैटर्न है? यदि नहीं, तो इस स्थिति में आमतौर पर किस पैटर्न का उपयोग किया जाता है?

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

0

मुझे यकीन है कि यह बेहतर प्रदर्शन प्रदान करता है, के बाद से वहाँ कोई ताला है हूँ, लेकिन यह सही है कि क्या कोड के इरादे पर निर्भर करता है। निश्चित रूप से, व्यवहार सिंक्रनाइज़ किए गए मामले से अलग है। चाहे व्यवहार लॉक केस के समान है, आप कहां लॉक करते हैं इस पर निर्भर करता है।

5

हाँ, यह आम है, कम से कम एक निश्चित डिग्री :)

पैटर्न आप उपयोग कर रहे इस आईबीएम आलेख में वर्णित किया गया है करने के लिए ->http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

(पैटर्न # 5, सस्ते पढ़ने-लिखने की लॉक चाल)

+1

+1 उत्कृष्ट लेख, ए को किसी भी व्यक्ति के लिए "पढ़ना चाहिए" जो वाष्पशीलता को बेहतर ढंग से समझना चाहता है – Cerber