энергонезависимо бесполезно на процессорах x86 - PullRequest
0 голосов
/ 07 апреля 2011

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

Означает ли это, что мы можем кодировать, не используя 'volatile' keywoard в Java, еслимы планируем работать только на процессорах x86?

Обновление:

Хорошо, если мы оставим вопрос о переупорядочении команд, можем ли мы предположить, что вопрос о назначениик энергонезависимому полю, невидимому для ядер, нет на процессорах x86?

Ответы [ 6 ]

6 голосов
/ 07 апреля 2011

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

5 голосов
/ 07 апреля 2011

О вашем обновлении: нет, мы не можем.Другие потоки могут просто читать устаревшие значения без обновления переменной.И еще одна проблема: JVM разрешено оптимизировать код до тех пор, пока он может гарантировать, что однопоточное поведение корректно.

Это означает, что что-то вроде:

public boolean var = true;
private void test() {
    while (var) {
       // do something without changing var
    }
}

может быть оптимизировано с помощьюJIT для while (true), если он хочет!

3 голосов
/ 07 апреля 2011

Существует большая разница между can sync the value of fields и always syncs the value of fields. x86 может синхронизировать поля, если у вас есть volatile, иначе это не так и не должно.

Примечание: энергозависимый доступ может быть в 10-30 раз медленнее, чем энергонезависимый, что является основной причиной того, что он не выполняется постоянно.

Кстати: знаете ли вы какие-нибудь многоядерные процессоры x86? Я бы подумал, что большинство из них были x64 с поддержкой x86.

2 голосов
/ 07 апреля 2011

запись в байт-код даже не должна вызывать запись в машинный код.если это не изменчивая запись.

2 голосов
/ 07 апреля 2011

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

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

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

1 голос
/ 07 апреля 2011

Я могу поручиться за volatile с некоторым использованием.Я был в ситуации, когда один поток имеет значение 'null' для переменной, а другой имеет правильное значение для переменной, которая была установлена ​​в этом потоке.Не весело отлаживать.Используйте volatile для всех общих полей:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...