En sistemas altamente concurrentes, puede ser difícil estar seguro de que su uso de bloqueos es correcto. Específicamente, pueden producirse interbloqueos si se adquieren bloqueos en un orden que no se esperaba mientras se adquiría en el orden correcto en otro hilo.Aserción del orden de sincronización en Java
Existen herramientas (por ejemplo, Coverity) que pueden realizar análisis estáticos en una base de código y buscar órdenes de bloqueo "inusuales". Me gustaría explorar otras opciones para satisfacer mis necesidades.
¿Existen herramientas livianas * para instrumentar código Java que pueda detectar casos en los que los bloqueos se adquieren en un orden distinto al esperado? Estoy de acuerdo con llamar explícitamente órdenes de bloqueo a través de comentarios/anotaciones.
Se prefieren las soluciones de fuente abierta o gratuita. Por favor, también comente si hay enfoques sin instrumentación para este problema.
* Para mis propósitos, medios de peso ligero ...
- Si se trata de la instrumentación, todavía puedo ejecutar mi programa con el mismo estadio rendimiento. 30-50% de degradación es aceptable, supongo.
- No tengo que pasar la mitad del día interactuando con la herramienta solo para obtener un "visto bueno". Idealmente, solo debería notar que lo estoy usando cuando hay un problema.
- Si se trata de instrumentación, debería ser fácil desactivarla para entornos de producción.
- No debería saturar mi código en cada declaración
synchronize
. Como mencioné anteriormente, estoy de acuerdo con comentar/anotar explícitamente los objetos o clases de objetos que se bloquean con ordenamientos relativos.
... es por eso que Actor Model y STM son cada vez más populares –
Alguien tenía una respuesta que hacía referencia a java.lang.Thread.holdsLock (Object) que se eliminó rápidamente. No pude encontrar ese método por mi cuenta, gracias por el puntero. Mi pregunta sigue en pie, sin embargo. –
¿Has encontrado algo decente para hacer algo como eso? Tengo un código de detección de interbloqueo bastante sofisticado en C++ y en mi caso me gustaría instrumentar nuestro código Java para detectar casos en los que los bloqueos en C++ y/o en el lado de Java podrían interferir entre sí y provocar interbloqueos. – Pavel