2014-10-24 14 views
7

रखें AtomicInteger के साथ "परिणाम सकारात्मक या शून्य" ऑपरेशन करने का कोई तरीका है? वांछित व्यवहार स्पष्ट करने के लिए:परमाणु इंटेगर: गैर-नकारात्मक

  • यदि वर्तमान मान शून्य से अधिक है, घटती
  • यदि वर्तमान मूल्य शून्य के बराबर है, ऐसा कुछ भी नहीं
  • (नकारात्मक वर्तमान मूल्य संभाला नहीं है)
+3

मुझे कोई रास्ता नहीं दिख रहा है। शायद आप 'java.util.concurrent.Semaphore' का उपयोग कर सकते हैं? यह हमेशा सकारात्मक होने की गारंटी है, और आप इसे 'अधिग्रहण() 'या' tryAququire()' के साथ घटा सकते हैं। – markspace

उत्तर

10

जावा 8 में, yes:

atomicInteger.updateAndGet(i -> i > 0 ? i - 1 : i); 

जावा 8 से पहले, no

3

मैं यह अग्रिम जावा 8 की तरह कुछ कर सकता है लगता है:

int val = atomicInt.get(); 
boolean success = false; 
while(val > 0 && !success) { 
    success = atomicInt.compareAndSet(val, val - 1); 
    if(!success) { 
     // Try again if the value is still > 0 
     val = atomicInt.get(); 
    } 
} 
// Check 'success' to see if it worked 

नहीं सबसे खूबसूरत कोड, लेकिन मैं इसे काम कर देता है लगता है।

+0

क्या आपको लगता है कि इस विधि को काम करने के लिए सिंक्रनाइज़ करने की आवश्यकता नहीं होगी? –

+0

नहीं, यह एक परमाणु इंटेगर का बिंदु है। – BarrySW19

संबंधित मुद्दे