7

データベースからデータをロードし、主キーを使用してキャッシュする Google グアバ キャッシュがあります。データベースから最終的に作成するオブジェクトは不変であり、オブジェクトを作成するにはいくつかのテーブルにアクセスする必要があります。次のシナリオで何が起こるか:

  • スレッド 1: cache.load(10) を呼び出し、値 10 のデータベースの主キーに基づいてキャッシュに値が設定されています。
  • スレッド 2: データベース行を主キー 10 で更新するため、cache.invalidate(10) を呼び出します。cache.load(10) が完了する前に無効化が呼び出されます。

load(x)の実行中にinvalidate(x)が呼び出されると、Guava Loading Cacheは何をしますか?

4

2 に答える 2

6

Javadocで現在指定されているように、 「このキャッシュに関連付けられている観察可能な状態は、読み込みが完了するまで変更されません」。ロードのセマンティクスは、「新しくロードされた値はCache.asMap().putIfAbsent、ロードが完了した後に使用してキャッシュに追加される」としてさらに指定されます。

コードを読んで、 invalidate または remove が呼び出されたときにロード エントリが無視される場所を確認することもできます。

于 2012-10-15T08:12:42.233 に答える
3

そこでは、次の 2 つの状況が考えられます。

  • スレッド 1 がLocalCache.Segment.lockedGetOrLoad()最初に実際のロード (13.0.1) のポイントに到達し、セグメント ロックが取得されました。この場合、ロードが終了し、ロックが解放され、計算された値が呼び出し元に返されますが、実行時にスレッド 2 によって無効化され ( LocalCache.Segment.remove()) 、ロックを取得できます。

  • スレッド 2 は、スレッド 1 が実際にロードを開始する前にロックを取得しました。エントリがまだそこにないため、無効化は実際には何も実行せず、スレッド 1 は最新の値をロードします。

于 2012-10-15T08:13:27.007 に答える