2012-10-14 9 views
6

Mam pamięć podręczną Google guava, która ładuje dane z bazy danych i buforuje je przy użyciu klucza podstawowego. Obiekty, które generuję z bazy danych, są niezmienne, a zbudowanie obiektu wymaga dostępu do kilku tabel. Co dzieje się w następujący scenariusz:Co robi program Google Guava LoadingCache, gdy wywołanie zostanie unieważnione podczas wykonywania obciążenia?

  • gwintu 1: wywołuje cache.load (10) i bufor jest wypełniana na podstawie klucza podstawowego bazy danych o wartości 10
  • gwintu 2: wiersz aktualizuje bazy danych z podstawowej klawisz 10, a więc wywołuje cache.invalidate (10) unieważnia się, zanim zakończy się cache.load (10).

Co robi Guava Loading Cache, gdy unieważnia się (x) podczas wykonywania load (x)?

+1

Robi [niewłaściwą rzecz] (https://github.com/google/guava/issues/1881). – dnault

Odpowiedz

3

Można mieć dwie sytuacje tam:

  • gwintu 1 osiągnął punkt rzeczywistego obciążenia (LocalCache.Segment.lockedGetOrLoad() w 13.0.1) po pierwsze, a zamek był acquired segmentu: w tym przypadku wykończeń ładowania , blokada to released, a obliczona wartość jest zwracana do osoby dzwoniącej, ale zostanie unieważniona przez wątek 2, gdy uruchomi się (LocalCache.Segment.remove()) i może być zablokowana na acquire.

  • Wątek 2 uzyskał blokadę przed rozpoczęciem ładowania wątku 1: unieważnienie tak naprawdę nic nie robi, ponieważ wpis nie jest jeszcze dostępny, a wątek 1 ładuje aktualną wartość.

6

Zgodnie z bieżącym opisem w the Javadoc "Żaden obserwowalny stan powiązany z tą pamięcią podręczną nie jest modyfikowany do czasu zakończenia ładowania". Semantyka ładowania jest dodatkowo określona jako "Nowo załadowane wartości są dodawane do pamięci podręcznej przy użyciu Cache.asMap().putIfAbsent po zakończeniu ładowania."

Możesz także przeczytać the code, aby zobaczyć, gdzie ładowane wpisy są ignorowane, gdy wywoływane są unieważnienia lub usunięcia.