VOLATILE требуется в одноядерной многопоточной среде? - PullRequest
0 голосов
/ 01 августа 2020

Нужно ли мне использовать переменную VOLATILE, если я использую одноядерный компьютер и многопоточную среду

Насколько я понимаю, потоки не имеют собственного кеш-пространства.

Они используют кеш ядра, в котором они работают.

Теперь, если это одноядерный компьютер, все они будут использовать один и тот же кеш.

Пожалуйста, исправьте / добавьтеБольше, чем я понимаю

1 Ответ

3 голосов
/ 03 августа 2020

Компилятор также может переупорядочивать инструкции.

Например:

class SomeRunnable implements Runnable{
  public boolean stop;

  public void run(){
     while(!stop)
         println("hello");
  }
}

Поскольку переменная stop не помечена как изменчивая (или не используется в синхронизированном блоке), компилятор можно бесплатно преобразовать приведенный выше код в:

class SomeRunnable implements Runnable{
  public boolean stop;

  public void run(){
     if(stop)return;
     for(;;)
         println("hello");
  }
}

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

Лучше не думать о кэшах, потому что:

  • если только вы знаете, о чем говорите, возможно, вы это неправильно понимаете
  • это зависит от архитектуры процессора.

Если вы хотите понять Java одновременный, тогда вам нужно чтобы понять модель памяти Java.

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