यदि कई थ्रेड "incrementCount" पद्धति का आह्वान करते हैं तो क्या निम्नलिखित कोड को दौड़ की स्थिति समस्या का कारण होगा?
< कोड> सार्वजनिक वर्ग नमूना {निजी परमाणुइंटर काउंटर = नया परमाणुइंटर (0); सार्वजनिक int प्राप्त करेंकंटकॉइंट {इंट वर्तमान = काउंटर.गेट और इंकेंट (); यदि (counter.compareAndSet (8, 0)) वर्तमान = 0; वर्तमान वापसी; }}यदि यह रेस की स्थिति का कारण बनता है, तो क्या सिंक्रनाइज़ किए गए कीवर्ड का उपयोग करने के अलावा संभव समाधान क्या है?
आप संभवतः काउंटर को 8 से अधिक नहीं जाने देना चाहते हैं और यह काम नहीं करेगा। दौड़ परिस्थितियां हैं।
ऐसा लगता है कि आप एक मॉड 8 काउंटर चाहते हैं। सबसे आसान तरीका है अकेले AtomicInteger को छोड़ना और
int वर्तमान = counter.get औरIncrement () & amp; जैसे कुछ का उपयोग करना है। 7;
(जो
% 8 का ठीक और अनुकूलित संस्करण है)। कम्प्यूटेशन मॉड 8 या दो की किसी भी अन्य शक्ति के लिए यह पूरी तरह से काम करता है, अन्य नंबर के लिए आपको
% N की आवश्यकता होती है और नकारात्मक संख्याओं में आईटी से अधिक समस्याएं आती हैं।
प्रत्यक्ष समाधान निम्नानुसार हो जाता है
सार्वजनिक int getCurrentCount {जब तक (सच) {int current = counter.get (); Int अगले = (वर्तमान + 1)% 8; अगर (counter.compareAndSet (वर्तमान, अगले))) अगले वापसी; }}
यह कैसे है
getAndIncrement () ही काम करता है, बस थोड़ा संशोधित।
Comments
Post a Comment