Почему результат меняется при Atomic операциях?

Почему колебается результат на 1 единицу при использовании атомарности?
55251 или 55252
package src;

import java.util.concurrent.atomic.AtomicInteger;

public class Lucky {
    static AtomicInteger x = new AtomicInteger(0);
    static AtomicInteger count = new AtomicInteger(0);

    static class LuckyThread extends Thread {
        @Override
        public void run() {
            while (x.get() < 999999) {
                int i  = x.incrementAndGet();
                if ((i % 10) + (i / 10) % 10 + (i / 100) % 10 == (i / 1000)
                        % 10 + (i / 10000) % 10 + (i / 100000) % 10) {
                    System.out.println(x);
                    count.incrementAndGet();
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new LuckyThread();
        Thread t2 = new LuckyThread();
        Thread t3 = new LuckyThread();
        t1.start();
        t2.start();
        t3.start();
        t1.join();
        t2.join();
        t3.join();
        System.out.println("Total: " + count);
    }
}


P.S при синхронизации вроде бы проблем нет
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
xez
@xez Куратор тега Java
TL Junior Roo
Вот тут ошибка: while (x.get() < 999999)
Вполне атомарно можно получить тут true на неограниченное количество потоков.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы