Pregunta

¿Cómo probaría usted una garantía de publicación segura en Java?

Para ser concreto:

Tengo una interfaz de caché que tiene un método getOrLoad (clave K, cargador de ObjectLoader). La cosa es que, si un Caché no puede encontrar un objeto para la clave dada, entonces debe cargarlo desde la instancia de ObjectLoader. Sin embargo, se requiere que el Caché garantice que el hecho de cargar un objeto desde el cargador y ponerlo en el Caché, constituye una publicación segura.

Ahora estoy escribiendo una prueba genérica de junit para esta interfaz de caché y me pregunto cómo probaría que las implementaciones de caché se adhieran a esta garantía de publicación segura.

¿Alguna idea? El código real se encuentra en la parte del módulo test-systest del repositorio de código en caso de que Quiero meter en los archivos reales.

¿Fue útil?

Solución 2

Descubrí un presentación de JavaOne por Bill Pugh, Brian Goetz y Cliff Haga clic en el tema de prueba de código concurrente. Ellos sugirieron este enfoque, que creo que es lo mejor que he escuchado:

Varios productores crean objetos con estado e inseguros para subprocesos con una implementación de código hash dependiente del estado. A medida que los objetos se envían a través del supuesto punto de sincronización, los códigos de hash se resumen (en forma local). Del mismo modo, los consumidores del otro lado de la puerta resumen los códigos de hash.

Al final de la prueba, resumimos todos los resultados para los productores y consumidores, respectivamente. Si las dos sumas son iguales, la prueba pasa.

También podríamos usar XOR como alternativa a la suma. De hecho, cualquier operación conmutativa servirá. Solo tenga en cuenta que el arnés de prueba en sí no debe introducir ninguna sincronización adicional.

Otros consejos

Tal vez pueda usar ConTest para al menos darle un poco más de confianza de que tu código es correcto.

Tendrá que implementar un par de pruebas que ejecuten varios subprocesos simultáneamente. ConTest aumentará la probabilidad de que un error de concurrencia sea realmente revelado mediante la instrumentación de un código de bytes (agregando instrucciones de suspensión y rendimiento condicionales controladas heurísticamente).

En realidad, obtener un error debido a una publicación insegura es muy difícil (si alguien sabe cómo hacerlo, avíseme). El análisis estático es su mejor apuesta para una solución automatizada. Me apegaría a la revisión del código y no me preocuparía demasiado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top