मैं AtomicBoolean
के साथ synchronized
ब्लॉक को प्रतिस्थापित करके अपने कोड में थ्रेड विवाद को काटने की कोशिश कर रहा था।परमाणु बूलियन बनाम सिंक्रनाइज़ ब्लॉक
public void toggleCondition() {
synchronized (this.mutex) {
if (this.toggled) {
return;
}
this.toggled = true;
// do other stuff
}
}
और AtomicBoolean
के साथ वैकल्पिक:
public void toggleCondition() {
if (!this.condition.getAndSet(true)) {
// do other stuff
}
}
AtomicBoolean
के कैस संपत्ति का लाभ उठाते हुए जिस तरह से तुल्यकालन पर भरोसा तो मैं एक भाग की तुलना में तेजी से किया जाना चाहिए
यहाँ synchronized
साथ एक उदाहरण है little micro-benchmark।
10 समवर्ती धागे और 1000000 पुनरावृत्तियों के लिए, AtomicBoolean
synchronized
ब्लॉक से थोड़ा तेज में आता है।
औसत समय AtomicBoolean साथ toggleCondition() पर खर्च: 0.0338
(धागा प्रति)औसत समय सिंक्रनाइज़ साथ toggleCondition() पर खर्च: 0,0357
मैं जानता हूँ कि सूक्ष्म मानक के लायक हैं क्या वे लायक हैं लेकिन अंतर अधिक नहीं होना चाहिए?
आपके साथ मूल कोड में बहुत कम विवाद हो सकता है। आपको अनुकूलित करने के लिए क्या आवश्यक सोचने के लिए प्रेरित किया? –
मैंने लिखा एक lib पर प्रदर्शन परीक्षण चल रहा है। मेरे पास सिंक्रनाइज़ किए गए ब्लॉक और मैन्युअल प्रतीक्षा()/सूचित() सिंक्रनाइज़ेशन का उपयोग करके एक डिफ़ॉल्ट कार्यान्वयन था। इसके बाद मैंने केवल java.util.concurrent सामान का उपयोग करके इसका एक और संस्करण आज़माया और मुझे सबसे खराब परिणाम मिला। यहां कक्षाएं हैं: http://github.com/brunodecarvalho/hotpotato/blob/master/src/main/java/org/factor45/hotpotato/request/ConcurrentHttpRequestFuture.java और http://github.com/brunodecarvalho/hotpotato /blob/master/src/main/java/org/factor45/hotpotato/request/DefaultHttpRequestFuture.java – biasedbit
मुझे एक और माइक्रो-बेंचमार्क के बाद एहसास हुआ है (हाँ, मुझे पता है कि माइक्रो बेंचमार्क कुछ हद तक त्रुटिपूर्ण हैं ...) समस्या वास्तव में प्रतीक्षा()/सूचित() पर countDownLatch के उपयोग में झूठ बोला। इसके अलावा, परमाणु बूलियन दृष्टिकोण पूरी तरह से सुरक्षित नहीं था इसलिए मैंने इसे छोड़ दिया। – biasedbit