Что такое атомарные переменные в Java

Источник: Medium В этом руководстве рассмотрена работа атомарных переменных в Java. Поскольку они позволяют выполнять определенные операции атомарно или как единую неделимую операцию, атомарные переменные очень важны в параллельном программировании. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 1Ключевой особенностью Java является параллелизм, который позволяет нескольким потокам работать одновременно, что повышает эффективность и скорость работы систем. Однако у него есть некоторые недостатки, включая так называемое Состояние гонки (Race Condition) — ошибка проектирования многопоточной системы или приложения, при которой работа зависит от того, в каком порядке выполняются части кода. В такой ситуации могут помочь атомарные переменные.

Что такое атомарные переменные?

В Java атомарные переменные находятся в пакете java.util.concurrent.atomic. Учитывая, что они предлагают потокобезопасное программирование без блокировок, это повышает эффективность и предотвращает тупиковые ситуации, которые могут возникнуть при использовании традиционных методов синхронизации. Атомарная операция неделима. Это означает, что как только операция начинает выполняться, она выполняется до завершения, не прерываясь другим потоком. Эта атомарность жизненно важна для параллельного программирования, поскольку помогает предотвратить состояние гонки. В качестве примера рассмотрим операцию приращения (increment operation):

count++;
Кажется достаточно простой, правда? Но если копнуть глубже, то эта операция состоит из трех отдельных этапов:
  1. Чтение текущего значения count.
  2. Увеличение значения на единицу.
  3. Запись обновленного значения обратно в count.
В многопоточной среде поток может быть вытеснен после операции чтения и до операции записи. Затем другой поток может прочитать то же самое (старое) значение count, увеличить его и записать обратно. Когда первый поток возобновляет выполнение и записывает свое значение обратно в count, он перезаписывает значение из второго потока. В результате, несмотря на то, что count++ был вызван дважды, count увеличился только один раз. Атомарные переменные помогают решить эту проблему, гарантируя, что вся операция является атомарной и, следовательно, не может быть прервана.

Атомарные классы Java

Java предоставляет несколько атомарных классов, таких как:
  • AtomicInteger
  • AtomicLong
  • AtomicBoolean
  • AtomicReference
И другие… Давайте рассмотрим пример с использованием AtomicInteger:

AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
В этом примере incrementAndGet() является атомарной операцией. Она увеличивает значение count на единицу и возвращает обновленное значение. Независимо от того, сколько потоков одновременно вызывает этот метод, он всегда будет правильно увеличивать count.

Преимущества использования атомарных переменных

Атомарные переменные имеют несколько преимуществ:
  1. Производительность. Атомарные переменные более эффективны, чем блоки synchronized или методы. Это связано с тем, что они полагаются на поддержку атомарности на аппаратном уровне (например, инструкции сравнения и замены (CAS, compare-and-swap), а не на дорогостоящие методы, основанные на блокировках.
  2. Безопасность взаимных блокировок. Поскольку атомарные переменные не используют блокировки, они невосприимчивы к взаимоблокировкам (deadlocks)— серьезной проблеме в многопоточном программировании.
  3. Видимость: атомарные переменные имеют встроенные функции видимости. Когда переменная совместно используется несколькими потоками, изменения, сделанные одним потоком, немедленно видны другим потокам.

Подводим итоги

Атомарные переменные — мощный инструмент для обработки параллелизма в Java. Они предлагают более эффективную и безопасную альтернативу традиционным методам синхронизации, обеспечивая надежное решение многих проблем, связанных с многопоточным программированием. Понимание и эффективное использование атомарных переменных имеет решающее значение для написания высокопроизводительных параллельных приложений Java. Овладев этой концепцией, вы добавите ценный навык в свой опыт программирования на Java.

IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время

Источник: Medium Автор этой публикации поделиться полезными приемами, которые он использует в среде разработке IntelliJ IDEA (Windows) для экономии времени при написании кода.

Основные горячие клавиши

Rename (Shift + F6): меняет имя переменной, метода, класса или любого другого символа в кодовой базе. Обновляет все вхождения символа безопасным и эффективным способом. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 2Extract Method (Ctrl + Alt + M): превращает блок кода в новый метод, автоматически создав сигнатуру метода и обновив исходный код для вызова нового метода. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 3Extract Variable: (Ctrl + Alt + V): превращает выражение в отдельную переменную. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 4Extract Constant: (Ctrl + Alt + C): превращает выбранное выражение в константу. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 5Inline (Ctrl + Alt + N): обратная операция для всех ярлыков Extract (Извлечь). Move Statement (Ctrl + Shift + ↑/↓): перемещение строки или блока вверх/вниз. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 6Generate (Alt + Insert): позволяет в несколько кликов генерировать геттеры/сеттеры, переопределять методы или генерировать тестовые классы. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 7Show Context Actions (Alt + Enter): В зависимости от положения курсора возвращает опции, которые может сделать IDEA. Примеры:
  • Заменить один цикл другим (курсор на “for”)

    Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 8
  • Создать локальную переменную (курсор в конце строки)

    Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 9
  • Инвертировать условие “if” (курсор на == или !=)

    Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 10
  • Преобразование в атомарное (курсор на имени переменной)

    Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 11

Плагины

GenerateAllSetter: этот плагин позволяет вам генерировать все “установленные” методы для класса одновременно. Они могут быть пустыми или предварительно заполненными некоторыми значениями по умолчанию. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 12String Manipulation: супермощный плагин! В этой статье невозможно описать все возможности. Основные здесь:
  • Переключение регистров (пример: snake_case / camelCase)
  • Выравнивание текста (пример в GIF)
  • Сортировка текста (пример в GIF)
  • Кавычки/без кавычек, замена “ на '
Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 13 Key Promoter X: Если вы хотите знать все горячие клавиши и не использовать мышь, этот плагин для вас! Если вы используете что-то с горячей клавишей, то Key Promoter уведомит вас об этом и даже даст вам возможность установить горячие клавиши для этого действия. Кроме того, у него есть статистика! Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 14

Перемещайтесь по своему коду

Go To Declaration (Ctrl + B): переход к начальному объявлению созданного класса, вызываемого метода или поля. Recent Files (Ctrl + E): Показать список недавно просмотренных файлов. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 15Search everywhere (Double Shift): Позволяет искать классы, методы, файлы, команды, действия и так далее.
  • Ctrl + N — Искать классы (открывает вкладку Classes)
  • Ctrl + Shift + N — Искать файлы (открывает вкладку Files)
  • Ctrl+Shift+A — Поиск действий (открывает вкладку Actions)
Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 16Multiple cursors: отлично помогает, когда нужно отредактировать несколько строк с помощью одного шаблона.
  • Перетащите несколько курсоров (удерживайте Alt + щелчок/перетаскивание левой кнопкой мыши) (удерживайте также Shift, если вы хотите добавить курсоры после отпускания левой кнопки).

    Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 17
  • Выделить следующее вхождение (Alt + J)
  • Отменить выбор предыдущего вхождения (Alt + Shift + J)
  • Выделить все вхождения (Ctrl + Alt + Shift + J)

    Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 18
Расширить выделение (Ctrl + W): позволяет быстро выбирать блоки кода с разным уровнем детализации. Уменьшить выделение (Ctrl + Shift + W): то же, но обратное действие. Кофе-брейк #240. Что такое атомарные переменные в Java. IntelliJ IDEA: полезные приемы и плагины, которые экономят ваше время - 19Перемещение по слову (Ctrl + →, Ctrl + ←): переместите курсор в начало/конец слова. С помощью Hold Shift вы выберете слово от позиции курсора до начала/конца термина. Символы не считались словом.

Живые шаблоны

  • psvm — создать метод public static void main(String[] args).
  • fori — создать цикл for с индексом
    
    for(int $INDEX$ = 0; $INDEX$  < $LIMIT$; $INDEX$++)
    
  • iter — создать цикл с итерируемым объектом или массивом
    
    for($ELEMENT_TYPE$ $VAR$ : $ITERABLE_TYPE$)
    
  • prsfprivate static final
  • psfpublic static final
Также вы можете создавать свои собственные шаблоны. Перейдите в “Settings” -> “Editor” -> “Live templates”. Там вы можете увидеть все шаблоны и создать свой собственный. Например, если вы действительно часто используете List.of(...), то вы можете создать шаблон с именем list, и текст шаблона будет: List.of($VAR$).