Directrices para probar código multiproceso o garantizar que el código sea seguro para subprocesos

¿Hay alguna guía para probar el código de subprocesos múltiples (que no sea arrojar un montón de hilos al problema y cruzar los dedos).

Básicamente estoy buscando buenas maneras de probar la corrupción de datos, puntos muertos y otros problemas de concurrencia. Esencialmente quiero poder probar que el código es seguro para subprocesos a través de una prueba.

¿Hay marcos de trabajo en Java que le permitan escribir pruebas fácilmente para un escenario multiproceso?

He escrito muchos códigos de subprocesos múltiples y nunca he encontrado nada que pueda probar fácilmente los problemas de corrección de concurrencia que no he predicho. La mayoría de las veces tengo que pensar en el escenario en el que se puede romper y luego cómo podría probar su corrección en una versión extrema de esto (a menudo usando CountDownLatches o similar para doblarlo de la forma en que creo que se puede romper.

Definitivamente use FindBugs y herramientas de análisis estático similares para ayudar a encontrar problemas potenciales, y definitivamente mantenga sus problemas de concurrencia lo más simples posible. Los problemas de memoria mutable compartidos son difíciles, pero en realidad es bastante fácil redefinir el problema para que no compartas el estado mutable, solo el estado inmutable. Eso hace la vida mucho más simple. Ah, y lee JCiP – luego lee de nuevo. Y haz que revisen tu código.

GroboUtils, http://groboutils.sourceforge.net/testing-junit/using_mtt.html , proporciona algunas utilidades de JUnit para probar Threads.