मेरा एक बहुत ही गूंगा सवाल है। अगर मैं परमाणु संदर्भों का उपयोग करता हूं तो तुलना करें और इस तरह सेट करें

    original.set(atomic.get());
    long next = some new value
    atomic.compareAndSet(original.get(), next);
    ....more code....

तुलना विफल होने पर अधिक कोड अभी भी अपडेट किया जाता है (यानी परमाणु को किसी अन्य थ्रेड द्वारा अपडेट किया गया है)। मैं एक असाइनमेंट में एक त्रुटि खोजने की कोशिश कर रहा हूं और यही एकमात्र चीज है जिसके बारे में मैं सोच सकता हूं और मैं कुछ घंटों से कोशिश कर रहा हूं।

पी.एस. अजीब तरह से, अगर मैं इस कोड पर सिंक्रनाइज़ का उपयोग करता हूं तो यह मुझे मेरे लैपटॉप पर सही उत्तर देता है, लेकिन मेरे डेस्कटॉप पर नहीं

-1
Olli 14 अप्रैल 2020, 17:04

2 जवाब

सबसे बढ़िया उत्तर

मंगत रायमोदी और सोतिरियोस डेलिमानोलिस ने मुझे सही रास्ते पर ला खड़ा किया। एक साधारण फिक्स:

    original.set(atomic.get());
    long next = some new value
    while(!atomic.compareAndSet(original.get(), next))
    {
      do above again
    }
    ....more code....

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

0
Olli 14 अप्रैल 2020, 14:30

आप परमाणु का सही उपयोग नहीं कर रहे हैं। देखें परमाणु बूलियन, उदाहरण के लिए। सभी परमाणु एक जैसे व्यवहार करते हैं; #compareAndSet(अपेक्षित, अद्यतन) बूलियन अर्थ देता है (सीधे javadocs से true if successful. False return indicates that the actual value was not equal to the expected value.

दूसरे शब्दों में, आपका कोड होगा

if(atomic.compareAndSet(original.get(), next)){
//only executes if the CAS is successful
}
0
Brad Larson 14 अप्रैल 2020, 14:57