Разработка на 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 и другие. Потренируетесь под руководством опытных наставников и соберете сильное портфолио. На курсе действует гарантия трудоустройства: поможем вам найти работу или вернем деньги за курс.
Добавить комментарий