2012-02-27 7 views
0

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

long lastUpadate; 
... 

public void checkCach(){ 

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

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

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

ответ

1

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

1

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

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

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