Тесты Пообщаться с GPT Протестировать код
Программирование Аналитика Дизайн Маркетинг Управление проектами
09 Дек 2023
2 мин
2571

Использование AtomicReference в Java

Пройдите тест, узнайте какой профессии подходите

AtomicReference в Java используется для обеспечения атомарности операций в многопоточных программах. Это означает, что операции выполняются как единый, неделимый

Разработка на Java — востребованное направление, такие специалисты будут нужны на рынке еще долго. На курсе «Java-разработчик» от Skypro освоить профессию можно с нуля за 11 месяцев, даже если вы гуманитарий и ничего не знаете об IT. Программа составлена от простого к сложному и адаптирована для новичков. Преподаватели — практикующие специалисты из крупных компаний: «Сбер», «Самокат» и других.

AtomicReference в Java используется для обеспечения атомарности операций в многопоточных программах. Это означает, что операции выполняются как единый, неделимый процесс, которые не могут быть прерваны другими потоками.

Рассмотрим типичную проблему, когда два потока пытаются обновить одну и ту же переменную.

public class Main {
    static int counter = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                counter++;
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                counter++;
            }
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println(counter);
    }
}

Здесь два потока пытаются увеличить счетчик на 10 000. Однако, поскольку операция инкремента (counter++) не атомарна, окончательное значение счетчика может быть меньше 20 000.

Проблему можно решить, используя AtomicReference. AtomicReference обеспечивает атомарные операции на объектах, в данном случае на Integer.

public class Main {
    static AtomicReference<Integer> counter = new AtomicReference<>(0);

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                counter.updateAndGet(v -> v + 1);
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                counter.updateAndGet(v -> v + 1);
            }
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println(counter.get());
    }
}

В данном примере используется метод updateAndGet(), который обновляет значение атомарной ссылки и возвращает обновленное значение. Это гарантирует, что операция будет выполнена атомарно, и никакой другой поток не сможет прервать ее.

Таким образом, AtomicReference не обязательно нужен во всех многопоточных программах. Он полезен тогда, когда необходимо гарантировать атомарность операций с объектами.

В Skypro на курсе «Java-разработчик» вы научитесь писать программы для игр и приложений, освоите все нужные инструменты: Git, GitHub, Docker, Swagger, PostgreSQL и другие. Потренируетесь под руководством опытных наставников и соберете сильное портфолио. На курсе действует гарантия трудоустройства: поможем вам найти работу или вернем деньги за курс.

Добавить комментарий