Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
08 Май 2023
3 мин
4517

Различия между atomic, volatile и synchronized в Java

Прежде всего, необходимо понять, что это ключевые слова в языке программирования Java, которые используются для обеспечения корректной работы многопоточных

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

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

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

Atomic

Atomic в Java представляет собой классы в пакете java.util.concurrent.atomic, которые позволяют выполнять атомарные операции. То есть, эти операции выполняются как единое целое и не могут быть прерваны.

В примере с счетчиком можно использовать AtomicInteger. Метод incrementAndGet() этого класса атомарно увеличивает значение счетчика на один и возвращает новое значение. Таким образом, даже если два потока одновременно вызовут этот метод, счетчик корректно увеличится на два.

Volatile

Ключевое слово volatile в Java гарантирует, что значение переменной будет сразу же записано в основную память, а не в кэш процессора, и любые другие потоки будут видеть это обновленное значение.

Вернемся к примеру с счетчиком. Если объявить счетчик как volatile int, то любые изменения его значения будут сразу же записаны в основную память, и другие потоки будут видеть это новое значение. Однако это не гарантирует атомарности операций. То есть, если два потока одновременно прочитают значение счетчика, увеличат его на один и запишут обратно, проблема с увеличением счетчика только на один, а не на два, все еще останется.

Освойте Java на курсе онлайн-университета Skypro. Учебе нужно будет уделять всего 10 часов в неделю: сможете совмещать с работой и личными делами. Вас ждут 440 часов теории и практики, мастер-классы с реальными рабочими задачами, опытные преподаватели, кураторы и наставники. За время обучения сделаете два полноценных проекта для портфолио и множество домашних заданий, чтобы отработать навыки.

Synchronized

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

Если применить synchronized к методу увеличения счетчика, то в любой момент времени только один поток сможет выполнить этот метод. Если другой поток попытается выполнить этот метод в то же время, он будет ждать, пока первый поток не завершит работу.

В заключении стоит отметить, что выбор между atomic, volatile и synchronized зависит от конкретной ситуации. В некоторых случаях может быть достаточно использовать volatile, в других может потребоваться более строгая синхронизация с помощью synchronized или atomic.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

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