java - ¿Cuáles son las estrategias de sincronización para Prevayler?
concurrency synchronization (2)
Prevayler garantiza que todas las escrituras (a través de sus transacciones) están sincronizadas. Pero, ¿qué hay de las lecturas?
¿Es correcto que las lecturas sucias sean posibles si no se usa sincronización explícita (en el código de usuario)?
¿Son posibles si un objeto comercial se lee como:
// get the 3rd account
Accont account = (Bank)prevayler.prevalentSystem().getAccounts().get(2);
?
Si es así, ¿qué estrategias de sincronización son buenas para un código de usuario?
(Considere que un objeto comercial A contiene una colección de objetos comerciales Bs),
- usando una colección sincronizada (de Bs dentro de A), por ejemplo del paquete java.util.concurrent?
- sincronizar la colección lee las transacciones externas con las escrituras de la colección dentro de las transacciones, por ejemplo, usando el código "sincronizado (recopilación)" alrededor de las lecturas y escrituras?
Ha pasado mucho tiempo desde que miré a Prevayler (lo usé en un proyecto de POC hace unos 6 o 7 años). Estoy bastante seguro de que si hace todas sus lecturas y escrituras a través de Prevayler no se requiere más sincronización, sin duda no tuve que hacerlo en lo que hice, y eso tenía varios hilos usando el almacén de datos.
La forma recomendada es usar JMatch Query y Prevayler.execute (Query). Ya sea directamente o mediante el uso de subclases.
Los resultados devueltos deben ser valores primitivos u objetos inmutables. Si planea devolver objetos mutables, debe subclasificar JMatch Query para hacer estas copias profundas. De esta manera se obtiene un sistema que bloquea cada lectura sensible con otras lecturas y escrituras (sensibles). Esto puede acelerar y simplificar el desarrollo, especialmente para desarrolladores sin experiencia de programación multiproceso.
Si necesita más rendimiento con una carga simultánea alta, que se supone que es un caso raro, puede utilizar el bloqueo de grano fino descrito anteriormente, utilizando "sincronizado" y java.util.concurrent.
Vea esta discusión para más detalles.