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

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

6 ответов


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

наиболее эффективным методом является тщательная обзор кода разработчиком(разработчиками), опытным в параллелизме.


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

вы должны очень тщательно проанализировать свою программу, чтобы убедиться, что это потокобезопасно. Рассмотрим покупку "Java concurrency in practice" (очень хорошее объяснение параллелизма в java).


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

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


ресурсы :


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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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