2015-04-14 15 views
6

Cách cập nhật AtomicInteger nếu giá trị hiện tại của nó nhỏ hơn giá trị đã cho? Ý tưởng là:Làm cách nào để cập nhật Atomic dựa trên điều kiện?

AtomicInteger ai = new AtomicInteger(0); 
... 
ai.update(threadInt); // this call happens concurrently 
... 
// inside AtomicInteger atomic operation 
synchronized { 
    if (ai.currentvalue < threadInt) 
     ai.currentvalue = threadInt; 
} 
+0

pls dán mã làm việc nghĩa mà không cần bất kỳ lỗi biên dịch .. – SMA

+0

mã đăng của bạn đoạn trích không có ý nghĩa. Bạn lần đầu tiên cập nhật 'ai' (bất kể bạn muốn nói gì với .update()) và sau khi bạn kiểm tra giá trị bằng cái mới. – SubOptimal

+1

Đây là một câu hỏi hay và nó có ý nghĩa hoàn hảo. Đối với những lời chỉ trích: OP không thể viết mã làm việc cho việc này. Nếu anh ta đã làm, anh ta sẽ cần phải biết câu trả lời, vì vậy anh ta chỉ có thể đăng mã giả. –

Trả lời

11

Nếu bạn đang sử dụng Java 8, bạn có thể sử dụng một trong các phương pháp cập nhật mới trong AtomicInteger, bạn có thể chuyển biểu thức lambda. Ví dụ:

AtomicInteger ai = new AtomicInteger(0); 

int threadInt = ... 

// Update ai atomically, but only if the current value is less than threadInt 
ai.updateAndGet(value -> value < threadInt ? threadInt : value); 
4

Nếu bạn không có Java 8, bạn có thể sử dụng một CAS-loop như thế này:

while (true) { 
    int currentValue = ai.get(); 
    if (newValue > currentValue) { 
     if (ai.compareAndSet(currentValue, newValue)) { 
      break; 
     } 
    } 
} 
Các vấn đề liên quan