2014-11-05 2 views
0

Я объявила переменную экземпляра как voltile. Скажем, два потока создаются двумя процессорами под многоядерным ядром, где поток обновляет переменную. Чтобы обеспечить мгновенную видимость , я считаю, что объявление переменной как volatile является правильным выбором здесь, так что обновление, выполняемое потоком, происходит в основной памяти и видимо для другого потока. Справа?Имеет ли переменная volatile здесь (многоядерный процессор)?

Намерение здесь, чтобы понять концепцию в терминах многоядерного процессора.

+0

Какой тип переменной? – weston

+0

@weston «Переменная экземпляра» - это то же самое, что и «поле». – RealSkeptic

+0

Я думаю, вы должны опубликовать код, который слишком туман, что происходит. Вы обновляете ссылку или содержимое этого типа? – weston

ответ

1

Я предполагаю, что вы рассматриваете использование volatile против использования каких-либо специальных положений для параллелизма (например, или AtomicReference).

Не имеет значения, используете ли вы одиночный или многоядерный обмен данными между потоками: never безопасный без volatile. Есть много других вещей, которым может управлять среда исполнения; в основном он может притворяться, что поток доступа - это единственный поток, запущенный на JVM. Поток может считывать значение один раз и хранить его в стеке вызовов навсегда; цикл, считывающий значение, но никогда не записывающий его, может быть преобразован таким образом, что значение считывается только один раз с самого начала и никогда не пересматривается, и так далее.

Так идея проста: использовать volatile —, но это не обязательно все вам нужно позаботиться о в параллельном коде.

+0

«Обмен данными между потоками никогда не будет безопасным без изменчивости» Нет! Как насчет блока синхронизации? – weston

+0

@weston. Из контекста должно быть ясно, что мы обсуждаем 'volatile' и ничего вообще. Разумеется, другие меры, которые вызывают отношения «* до-до», в порядке, например «AtomicReference». –

+0

Является ли значение само по себе неизменным или нет, здесь не имеет значения: мы обсуждаем видимость записи в переменной экземпляра. Если значение изменчиво и изменится после публикации, то просто «volatile» недостаточно (мой последний абзац об этом). –

0

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

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

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

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

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

+1

Только одно пояснение: запись в «volatile» с типом ссылки гарантирует, что все изменения объекта, предшествующего записи, будут видны в потоке после того, как он прочитает ссылку. Другими словами, 'volatile' - это все, что требуется для безопасного размещения * объекта в других потоках при условии, что объект не изменится после публикации. –

+0

Что произойдет, если несколько писем происходят в разных потоках одной и той же изменчивой переменной одновременно? –

Смежные вопросы