Этот Q ищет конкретные сведения о том, как именно Java делает видимым поле volatile
.Как Java управляет видимостью изменчивого поля?
Ключевое слово volatile
в Java используется для того, чтобы переменная «активно» была видна читателям этой переменной сразу после выполнения операции записи на ней. Это одна из форм отношений «до-отношений» - приводит к тому, что результаты записи подвергаются тому, кто имеет доступ к этой ячейке памяти этой переменной для некоторого использования. И когда используется, делает операции чтения/записи этой переменной атомарными - для long
& double
, а также - R/W для каждого другого типа var является атомарным уже.
Я ищу, чтобы узнать, что делает Java, чтобы сделать переменное значение видимым после операции записи?
Например .: Следующий код одного из ответов на this обсуждения:
public class Foo extends Thread {
private volatile boolean close = false;
public void run() {
while(!close) {
// do work
}
}
public void close() {
close = true;
// interrupt here if needed
}
}
Чтение и запись в логические литералы являются атомарными. если вызывается метод close()
, это атомная операция, чтобы установить значение close
как true
, даже если оно не объявлено как volatile
.
Что еще volatile
делает в этом коде, это значит, что изменение этого значения будет видно в тот момент, когда это произойдет.
Как именно volatile
достигает этого?
, отдав приоритет потокам с операциями с изменчивой переменной? если так - как, в планировании потоков или путем создания потоков с помощью операций чтения, найдите флаг, чтобы увидеть, существует ли очередь писателя? Я знаю, что «писать в поле volatile бывает - перед каждым последующим чтением этого же поля». Выбирает ли из них нити, которые имеют операцию записи на изменчивой переменной, прежде чем давать процессорное время тем потокам, которые только читаются?
Если это управляется на уровне планирования потоков (что я сомневаюсь), то выполнение потока с записью в нестабильном поле имеет больший эффект, чем кажется.
Как именно Java управляет видимостью переменных volatile
?
TIA.
Это гарантирует, что поток, записывающий переменную volatile, будет записываться в основную память и а не к кэшу процессора, и что потоки, читающие значение изменчивой переменной, не будут считывать ее из кеша процессора, а из основной памяти. Я не специалист по этим низкоуровневым аппаратным механизмам, –
CPU выполняет всю работу. JVM гарантирует, что он использует правильные инструкции. –