Я обновляю num[1]=0
из AtomicIntegerArray
num 1000 раз в 2 потоках.Data Races в AtomicIntegerArray
В конце 2 нитей в основной нити не должно быть значение num[1]
равно 2000, так как не должно быть расчётов данных в AtomicIntegerArray
.
Однако я получаю случайные значения < 2000. Может ли кто-нибудь сказать мне, почему?
Код:
import java.util.concurrent.atomic.AtomicIntegerArray;
public class AtomicIntegerArr {
private static AtomicIntegerArray num= new AtomicIntegerArray(2);
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new MyRun1());
Thread t2 = new Thread(new MyRun2());
num.set(0, 10);
num.set(1, 0);
System.out.println("In Main num before:"+num.get(1));
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("In Main num after:"+num.get(1));
}
static class MyRun1 implements Runnable {
public void run() {
for (int i = 0; i < 1000; i++) {
num.set(1,num.get(1)+1);
}
}
}
static class MyRun2 implements Runnable {
public void run() {
for (int i = 0; i < 1000; i++) {
num.set(1,num.get(1)+1);
}
}
}
}
Edit: Добавление num.compareAndSet(1, num.get(1), num.get(1)+1);
вместо num.set(1,num.get(1)+1);
не работает либо.
Привет, Люк: Да, вся операция была не атомной! Виноват !!! Что касается его решения, я знал о закодированном CompareAndSet, но не знал о методе accumulateAndGet. Использование GetAndIncrement тоже решило! Благодаря :) !! –