Проще говоря,
статические : static
переменные связаны с классом , а не с любым объектом . Каждый экземпляр класса совместно использует переменную класса, которая находится в одном фиксированном месте в памяти
volatile : это ключевое слово применимо к переменным класса и экземпляра .
Использование энергозависимых переменных снижает риск ошибок согласованности памяти, потому что любая запись в энергозависимую переменную устанавливает связь «происходит до» с последующим чтением этой же переменной. Это означает, что изменения в изменчивой переменной всегда видны другим потокам
Взгляните на эту статью , Javin Paul
чтобы лучше понять переменные переменные.
При отсутствии volatile
ключевого слова значение переменной в стеке каждого потока может отличаться. Делая переменную какvolatile
, все потоки получат одинаковое значение в своей рабочей памяти, и ошибок целостности памяти удалось избежать.
Здесь термин variable
может быть либо static
(классом) переменной, либоinstance
(объектной) переменной.
По вашему запросу:
В любом случае, значение статической переменной также будет одним значением для всех потоков, тогда почему мы должны использовать volatile?
Если мне нужно instance
переменная в моем приложении, я не могу использовать static
переменную. Даже в случаеstatic
переменной согласованность не гарантируется из-за кеша потоков, как показано на диаграмме.
Использование volatile
переменных снижает риск ошибок согласованности памяти, потому что любая запись в энергозависимую переменную устанавливает связь «произойдет до» с последующим чтением этой же переменной. Это означает, что изменения в изменчивой переменной всегда видны другим потокам.
Более того, это также означает, что когда поток читает переменную volatile, он видит не только последние изменения volatile, но также побочные эффекты кода, который привел к изменению => ошибки согласованности памяти все еще возможны с volatile переменными , Чтобы избежать побочных эффектов, вы должны использовать синхронизированные переменные. Но есть лучшее решение в Java.
Использование простого атомарного доступа к переменным более эффективно, чем доступ к этим переменным через синхронизированный код
Некоторые из классов в java.util.concurrent
пакете предоставляют атомарные методы, которые не зависят от синхронизации.
Обратитесь к этому высокоуровневому контролю параллелизма статье о для получения дополнительной информации.
Особенно взгляните на атомарные переменные .
Связанные вопросы SE:
Летучие против атомных
Летучий логический против AtomicBoolean
Разница между изменчивым и синхронизированным в Java