2010-03-14 5 views
42

(ध्यान दें कि यह प्रश्न सीएएस के बारे में नहीं है, यह " जावाडोक में असफल हो सकता है)। "नकली तौर पर विफल हो सकता है":कमजोर कैसे हो सकता है कमांडर एंडसेट विफल हो सकता है अगर यह बिल्कुल एंड्रेट की तरह लागू किया गया है?

AtomicInteger वर्ग से इन दो तरीकों के बीच जावाडोक में फर्क सिर्फ इतना है कि weakCompareAndSet टिप्पणी होता है।

अब जब तक मेरी आँखों कुछ जादू द्वारा धोखा दिया जाता है, दोनों विधि दिखते हैं ठीक उसी कर रहे हैं:

public final boolean compareAndSet(int expect, int update) { 
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 
} 

/* ... 
* May fail spuriously. 
*/ 
public final boolean weakCompareAndSet(int expect, int update) { 
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update); 
} 

तो मुझे लगता है कि मतलब है "मई" नहीं है "चाहिए" लेकिन फिर क्यों डॉन 'टी हम सब अपने codebase को यह जोड़ना प्रारंभ करें:

public void doIt() { 
    a(); 
} 

/** 
* May fail spuriously 
*/ 
public void weakDoIt() { 
    a(); 
} 

मैं वास्तव में है कि weakCompareAndSet()compareAndSet() के रूप में भी ऐसा ही प्रतीत होता है के साथ भ्रमित कर रहा हूँ अभी तक कि "नकली तौर पर विफल हो सकता है" जबकि दूसरा नहीं कर सकता।

जाहिर है "कमजोर" और "नकली असफल" से संबंधित एक तरह से कर रहे हैं "होता है-पहले" आदेश के लिए लेकिन मैं अभी भी बहुत इन दो AtomicInteger (और AtomicLong आदि) तरीके से संदेह में हूँ: जाहिरा तौर पर, क्योंकि वे बिल्कुल वही unsafe.compareAndSwapInt विधि पर कॉल करें।

मैं विशेष रूप से उलझन में है कि AtomicInteger जावा मेमोरी मॉडल परिवर्तन के बाद, जावा 1.5 में पेश किया गया तो (ताकि यह स्पष्ट रूप से कुछ है कि हो सकता है "1.4 में नकली तौर पर असफल" नहीं है, लेकिन जिसका व्यवहार को बदलकर "करेगा हूँ 1.5 " में नकली रूप से विफल नहीं है)।

+0

अच्छा प्रश्न Wiz –

+0

वास्तव में अजीब। यह एपीआई भविष्य के सबूत हो सकता है, लेकिन यह इसके बारे में जाने का एक अजीब तरीका है। ऐसा लगता है कि 'एटमिकएक्सजेड' वर्गों की सभी चीजें 'तुलना और सेट' और 'कमजोर कॉम्पारे एंडसेट' में समान होती हैं, इसलिए ऐसा नहीं है कि यह कार्यान्वयन के बीच स्थिरता के लिए है। – skaffman

+0

यह भी देखें http://stackoverflow.com/questions/4183202/java-compare-and-swap-semantics-and-performance – assylias

उत्तर

19

वहाँ कार्यान्वयन और विनिर्देश के बीच एक अंतर है ...

जबकि एक विशेष कार्यान्वयन पर वहाँ अलग अलग कार्यान्वयन प्रदान करने में ज्यादा बात नहीं हो सकता है, शायद अलग हार्डवेयर पर भविष्य कार्यान्वयन कर सकते हैं। चाहे यह विधि एपीआई में अपना वजन रखती है बहस योग्य है।

weak विधियों में परिभाषित करने से पहले होता है। गैर-weak संस्करण volatile फ़ील्ड की तरह व्यवहार करते हैं।

+0

@ टॉम हौटिन - tackline: +1 ... क्या आप किसी भी हार्डवेयर पर किसी भी JVM कार्यान्वयन (सूर्य या गैर-सूर्य) के बारे में जानते हैं जहां ऐसी विधियों के लिए विभिन्न कार्यान्वयन हैं? – SyntaxT3rr0r

+0

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

+0

"परिभाषित करने से पहले कमजोर विधियां भी नहीं होती हैं। गैर-कमजोर संस्करण अस्थिर क्षेत्रों की तरह व्यवहार करते हैं।" यदि हां, तो java.util.concurrent.atomic में ऐसी विधि का बिंदु क्या है; पैकेज? – Rollerball

1

बस थोड़ा खेलने के लिए, आपके सवाल थे

weakDoIt नकली तौर पर कैसे असफल हो सकता है अगर यह वास्तव में छदाम तरह कार्यान्वित किया जाता है?

यहां जवाब है!

public void doIt() { 
    a(); 
} 

/** 
* May fail spuriously 
*/ 
public void weakDoIt() { 
    a(); 
} 

void a(){ 
    if(Thread.currentThread().getStackTrace()[2].toString().contains("weakDoIt")) 
     System.out.println("I will fail spuriously!"); 
    else System.out.println("I won't fail spuriously!"); 
}