library google example cache java caching synchronization guava

java - google - Guava Cache, cómo bloquear el acceso mientras se realiza la eliminación



guava android version (1)

Usted indicó Guava Cache, pero no hay ningún ejemplo de código, así que le doy una respuesta general.

Para lo siguiente, supongo que tiene un esquema de "caché de carga", también conocido como "caché de autopoblación".

Solución 1: Diseñe correctamente sus interacciones de caché y transacciones de base de datos.

El proceso de actualización invalida la entrada de la memoria caché, tan pronto se inicia una transacción en ella.

begin transaction touch some of the entry data with SQL UPDATE to have it in the transaction remove the entry from the cache .... now you can do more operations on the database regarding the entry data if you have the proper isolation level, reads from the database will stall until the transaction is committed .... end transaction

Si elimina la entrada del caché y luego comienza la transacción, introduce una condición de carrera.

Solución 2: use cachés que bloquean operaciones simultáneas en la misma clave / entrada.

Eche un vistazo a ehcache Blocking Cache . O eche un vistazo a cache2k donde el comportamiento de bloqueo es el predeterminado.

Pero, sin embargo, debe realizar un bloqueo adicional en el nivel del cargador por su cuenta. Por ejemplo, como en el siguiente ejemplo.

Solución 3: realice el bloqueo usted mismo en la parte superior de la memoria caché y ajuste todas las operaciones de la memoria caché. Por ejemplo, con algo como:

Cache cache; Lock[] locks = new Lock[16]; { /* initialize locks */ } public Object get(Object key) { int idx = key.hashCode() % locks.length; locks[idx].lock(); try { return cache.get(key); } finally { locks[idx].unlock(); } } public void update(Object key, Object obj) { int idx = key.hashCode() % locks.length; locks[idx].lock(); try { return cache.put(key, obj); } finally { locks[idx].unlock(); } }

También puede consultar la implementación de BlockingCache de ehcache y obtener inspiración de allí.

¡Que te diviertas!

Tengo el hilo A, insertando un nuevo elemento en Guava Cache, y debido a la política de Tamaño, el caché desalojará el elemento asociado con la clave Y.

Desafortunadamente, el proceso de eliminación R de Y lleva mucho tiempo, y durante el tiempo en que Y está siendo procesado por R (ya desalojado pero aún en R), hay otro hilo B que intenta obtener datos asociados con la clave Y.

Básicamente, R intentará actualizar la base de datos para la clave Y, y mientras ese valor no se actualice, la cadena B intenta acceder a la base de datos para el valor asociado con la clave Y, que sigue siendo el valor anterior.

La pregunta es: ¿cómo puedo bloquear el hilo B para que no acceda al elemento con la tecla Y mientras R hace su trabajo?