Java-вычисления в Atomic - PullRequest
       10

Java-вычисления в Atomic

0 голосов
/ 05 декабря 2018

У меня небольшой вопрос по Java AtomicInteger.Я знаю, что могу реализовать поточно-ориентированные счетчики.Но я не смог найти ничего о сложных вычислениях с AtomicInteger.

Например, у меня есть такое вычисление (i и j являются объектными переменными, "this"):

public void test(int x) {
    i = i + ( j * 3 ) + x
}

Можно ли сделать этот метод поточно-ориентированным только с AtomicInteger?

Это допустимо?

public void test(int x) {
    do {
        int tempi = i.get();
        int tempj = j.get();
        int calc = tempi + ( tempj * 3 ) + x;
    } while (i.compareAndSet(tempi, calc));
}

Я думаю, что нет, потому что поток может изменить j во время вычисления.Чтобы избежать этого, я должен контролировать, если j изменяется во время расчета.Но я не нахожу функцию «просто сравнить» в AtomicInteger.

Псевдокод:

public void test(int x) {
    do {
        int tempi = i.get();
        int tempj = j.get();
        int calc = tempi + ( tempj * 3 ) + x;
    } while (i.compareAndSet(tempi, calc) && j.compare(tempj) /* changed */);
}

Кто-нибудь может мне помочь с разъяснениями?

1 Ответ

0 голосов
/ 05 декабря 2018

Поскольку ваши вычисления работают с несколькими AtomicXXX объектами (i, j), они не являются поточно-ориентированными.Семантика AtomicXXX реализована с помощью инструкций Compare-and-Swap (CAS) , которые не поддерживают более одного заполнителя одновременно.Вам нужен внешний замок монитора, чтобы сделать его потокобезопасным.

...