Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Volatile vs Atomic

#java #concurrency #volatile


В чем разница между модификатором volatile и классами из java.util.concurrent.atomic?
Что такого умеют последние, чего невозможно добиться посредством volatile? Почему?

И приведите, пожалуйста, use case для volatile? В каких ситуациях он (модификатор)
все же востребован и достаточен?
    


Ответы

Ответ 1



volatile обеспечивает только видимость изменений, а классы Atomic* дают еще и атомарность изменений. Простой пример - вам нужно проинкрементить счетчик и вернуть значение. Если поле счетчика будет обычным volatile int - возможна ситуация, когда два разных потока сначала проведут инкремент, а потом оба заберут результат двух инкрементов. Если же взять AtomicInteger, будет гарантирована атомарность, и каждый поток получит правильный результат. Типичное применение volatile: флаги (например, флаг выполнения потока); поля в POJO, которые используются только для хранения данных, когда по какой-то причине нет возможности использовать final-поля.

Ответ 2



volatile не позволяет потокам кэшировать переменную.

Комментариев нет:

Отправить комментарий