Есть ли способ или инструмент, который я могу использовать, чтобы проверить, является ли мой API потокобезопасным в Java? - PullRequest
8 голосов
/ 05 октября 2010

Я создаю инструмент и предоставляю API для внешнего мира, но я не уверен, является ли он потокобезопасным.Потому что пользователи могут захотеть использовать его в многопоточной среде.Есть ли способ или инструмент, который я могу использовать, чтобы проверить, является ли мой API поточно-ориентированным в Java?

Ответы [ 6 ]

17 голосов
/ 05 октября 2010

Нет .Там нет такого инструмента.Доказать, что сложная программа является поточно-ориентированной, очень сложно.

Вы должны тщательно проанализировать свою программу, чтобы убедиться, что она поточно-ориентирована.Подумайте о покупке "Java-параллелизма на практике" (очень хорошее объяснение параллелизма в Java).

6 голосов
/ 05 октября 2010

Стресс-тесты или инструменты статического анализа, такие как PMD и FindBugs могут выявить некоторые ошибки параллелизма вваш код.Таким образом, они могут показать, является ли ваш код не поточно-ориентированным.Однако они никогда не смогут доказать, является ли он потокобезопасным.

Наиболее эффективный метод - это тщательный просмотр кода разработчиками, имеющими опыт параллелизма .

1 голос
/ 05 октября 2010

Полагаю, те люди, которые говорят, что доказать, что многопоточная программа является поточно-ориентированной, невозможна, в некотором смысле верны. Произвольная многопоточная программа, закодированная без соблюдения строгих правил, просто будет иметь ошибки потоков, и вы не сможете достоверно доказать что-то, что не соответствует действительности.

Хитрость заключается не в том, чтобы написать произвольную программу, а в том, чтобы иметь логику многопоточности, достаточно простую, чтобы, возможно, быть правильной. Это может быть однозначно подтверждено инструментом.

Лучший такой инструмент, который я знаю, это CheckThread . Он работает на основе аннотаций или конфигурационных файлов xml. Если вы помечаете метод как «@ThreadSafe», а это не так, вы получаете ошибку во время компиляции. Это проверяется путем просмотра байтового кода для небезопасных операций, например, чтение / запись последовательностей в несинхронизированных полях данных.

Он также обрабатывает те API, которые требуют вызова методов в определенных потоках, например, Качели.

На самом деле он не обрабатывает взаимоблокировки, но их можно статически устранить, даже не требуя аннотации, с помощью такого инструмента, как Jlint . Вам просто нужно следовать некоторым минимальным стандартам, таким как обеспечение того, чтобы блокировки приобретались в соответствии с DAG, а не волей-неволей.

1 голос
/ 05 октября 2010

Это вариант (или так называемое «сокращение») проблемы остановки.Следовательно, это доказуемо неразрешимо. для всех нетривиальных случаев.(Да, это правка)

Это означает, что вы можете найти ошибки любым обычным способом (статистика, логика), но вы никогда не сможете полностью доказать, что их нет.

1 голос
/ 05 октября 2010

Вы всегда можете провести стресс-тестирование с помощью таких инструментов, как jmeter .

Но основная проблема с потоками заключается в том, что они в основном непредсказуемы, поэтому даже при стресс-тестах и ​​т. Д. вы не можете быть на 100% уверены, что они будут полностью поточно-безопасными .


Ресурсы:

0 голосов
/ 05 октября 2010

Вы не можете и никогда не сможете автоматически доказать, что программа является поточно-ориентированной, что вы можете доказать, что программа корректна (если только вы не думаете, что решили программу остановки, которую вы не сделали).

Итак, нет, вы не можете проверить, что API является поточно-ориентированным.

Однако в некоторых случаях вы можете доказать, что он сломан, и это здорово!

Вас также может заинтересовать автоматическое обнаружение взаимоблокировок, которые в некоторых случаях просто «просто работают». Я поставляю Java-программу на сотни рабочих станций с таким установленным детектором взаимоблокировки, и это замечательный инструмент. Например:

http://www.javaspecialists.eu/archive/Issue130.html

Вы также можете стресс-тестировать ваше приложение различными способами.

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

Вот вопрос, который я задал о том, как легко создать высокую нагрузку на процессор в системе Un * x, например:

Bash: простой способ установить настраиваемую нагрузку на систему?

...