अत्यधिक गहन परिपत्र समानांतर में एक से अधिक थ्रेड से वृद्धि की जाती काउंटर के लिए, मैं LongAdder
का उपयोग कर की सिफारिश करेंगे (जावा 8 के बाद से, मूल विचार को देखने के Striped64.java
के अंदर), क्योंकि यह AtomicLong
की तुलना में अधिक स्केलेबल है। इसे उपर्युक्त समाधानों में अनुकूलित करना आसान है।
यह माना जाता है कि get
ऑपरेशन LongAdder
में इतना बार नहीं होता है। counter.get
पर कॉल करते समय, इसे 'counter.get% max_number' पर लागू करें। हां, मॉड्यूलो ऑपरेशन महंगा है, लेकिन यह इस उपयोग-मामले के लिए कम है, जो कुल प्रदर्शन लागत को कम करना चाहिए।
हालांकि याद रखें, get
ऑपरेशन गैर-अवरुद्ध है, न ही परमाणु है।
स्रोत
2015-05-19 07:01:09
मुझे आश्चर्य है अगर यह वास्तव में परमाणु हो सकता है अगर धागा के बीच प्राथमिकता खो देता है '' 'this.ai.get()' '' और '' '} जबकि (! This.ai.compareAndSet (curVal, newal)); '' ' –
@ रेनाटो वापस: हाँ, यह होगा। सीएएस अर्थपूर्ण गारंटी देता है कि। –