Есть ли инструмент для определения того, правильно ли синхронизирована программа, как определено в JLS?

Спецификация языка Java 7 (JLS7-17.4.5) определяет «правильно синхронизированную» программу следующим образом: «Программа правильно синхронизирована тогда и только тогда, когда все последовательно согласованные выполнения свободны от гонок данных».

JLS7-17.4.5 также утверждает, что:

Без правильной синхронизации возможно очень странное, запутанное и нелогичное поведение.

Итак, с точки зрения программиста, было бы очень полезно иметь инструмент для определения того, "правильно ли синхронизирована" программа в соответствии с приведенным выше определением.

Есть такой инструмент? Я ничего не мог найти в гугле по этому поводу. Если такого инструмента нет, можно ли его сделать?


person Frans Lundberg    schedule 18.01.2013    source источник
comment
Обнаружение гонки статических данных Google для Java.   -  person Marko Topolnik    schedule 18.01.2013


Ответы (1)


FindBugs может найти некоторые ошибки параллелизма (ищите "Multithreaded correctness" на список обнаруженных ошибок) и, вероятно, есть другие подобные инструменты, но, в конце концов, некоторых ошибок можно избежать только путем тщательного проектирования и проверки кода.

Вы также можете протестировать свои классы на наличие проблем параллелизма, но это игра со статистикой, и некоторые ошибки могут никогда не появиться в зависимости от архитектуры ОС/ЦП и т. д.

Я слышал об инструменте Java для параллелизма, но никогда им не пользовался. Он несколько раз упоминался в официальном списке параллельных интересов JSR 166< /а>.

person assylias    schedule 18.01.2013
comment
Я знаю некоторые инструменты, которые можно использовать для проверки правильности синхронизации программы в общем смысле. Однако меня интересует инструмент, который может определить, правильно ли синхронизирована программа, согласно точному определению правильно синхронизированной программы в JLS7-17.4.5. - person Frans Lundberg; 18.01.2013
comment
@FransLundberg Обратите внимание, что правильная синхронизация является подмножеством многопоточной корректности. Например, если 2 оператора правильно синхронизированы по отдельности, у вас все равно может возникнуть общая проблема с правильностью, если программа требует, чтобы они также были атомарными. - person assylias; 18.01.2013
comment
@FransLundberg cf 17.4.3 Если в программе нет гонок данных, то все выполнения программы будут выглядеть последовательно согласованными. Последовательная согласованность и/или свобода от гонок данных по-прежнему допускают ошибки, возникающие из-за групп операций, которые должны восприниматься атомарно, а не таковыми. Таким образом, ваш вопрос можно перефразировать на статический поиск гонок данных, как это было предложено Марко в другом комментарии. - person assylias; 18.01.2013
comment
спасибо за вклад и ссылку. Я согласен с вашими комментариями: правильная синхронизация - это подмножество многопоточной корректности. И вопрос можно было бы перефразировать так, как вы/Марко заявляете. - person Frans Lundberg; 20.01.2013