Переменная видимость - PullRequest
       3

Переменная видимость

0 голосов
/ 27 февраля 2012

У меня есть устаревший код с реализацией кэша, которая выглядит следующим образом:

long lastUpadate;
...

public void checkCach(){

     if(lastUpdated + UPDATE_INTERVAL < System.currentTimeMillis()){
          synchronized(this){
               //cache update goes here
               lastUpdate = System.currentTimeMillis();
          }
     }
}

Может ли быть проблема в среде многоядерного процессора, из-за которой потоки не увидят обновленное поле lastUpdate, поскольку они проверяют его вне синхронизированного раздела(выпуск процессорных кешей ядра)?

Обновлено: также можно применить переупорядочение к этому синхронизированному блоку, установить первое поле lastUpdate, и только после этого будет выполнено обновление кэша

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

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

1 голос
/ 27 февраля 2012

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

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

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