2015-12-14 3 views
-1

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

Cache cache = cacheMap.get("cacheKey"); // get implemented synchronization 
if(cache!=null){ 
    return cache; 
} 
result = invokeLongTimeMethod(); //this method is thread-safe 
map.put("cacheKey",result); // put implemented synchronzization as well. 

invokeLongTimeMethod() должны быть обернуты с помощью ключевого слова() синхронный режим? как указано ниже

sychronized(this){ 
    result=invokeLongTimeMethod(); //notice: this method can be invoked more than one time 
} 

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

+5

Пожалуйста, задайте ясный, конкретный вопрос. – Manu

ответ

0

Это зависит от того, насколько плохим является вызов invokeLongTimeMethod дважды параллельно.

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

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

+0

спасибо, я так думаю – z10030313335

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