有没有什么方法或工具可以用来验证我的API在Java中是否是线程安全的?

有没有什么方法或工具可以用来验证我的API在Java中是否是线程安全的?,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我为外部世界制作了一个工具并提供了一个API,但我不确定它是否是线程安全的。因为用户可能不希望在多线程环境中使用它。有什么方法或工具可以用来验证我的API在Java中是否是线程安全的吗?您可以使用以下工具对其进行压力测试 但是线程的主要问题是它们大多是不可预测的,因此即使使用压力测试等你也不能100%确定它是完全线程安全的 资源: 否。没有这样的工具。证明一个复杂的程序是线程安全的是非常困难的 您必须非常仔细地分析您的程序,以确保它是线程安全的。考虑购买“java并发在实践中”(非常好的解

我为外部世界制作了一个工具并提供了一个API,但我不确定它是否是线程安全的。因为用户可能不希望在多线程环境中使用它。有什么方法或工具可以用来验证我的API在Java中是否是线程安全的吗?

您可以使用以下工具对其进行压力测试

但是线程的主要问题是它们大多是不可预测的,因此即使使用压力测试等你也不能100%确定它是完全线程安全的


资源:


    • 。没有这样的工具。证明一个复杂的程序是线程安全的是非常困难的


      您必须非常仔细地分析您的程序,以确保它是线程安全的。考虑购买“java并发在实践中”(非常好的解释java中的并发)。<> > P><强>应力测试< /St>>或<强>静态分析工具,如可以发现代码中的一些并发错误。因此,这些可以显示您的代码是否是线程安全的。然而,他们永远无法证明它是否是线程安全的


      最有效的方法是由在并发方面有经验的开发人员对代码进行彻底的审查

      您不能也永远无法自动证明程序是线程安全的,您可以证明程序是正确的(除非您认为您解决了暂停程序,而您没有解决)

      因此,不,您无法验证API是否是线程安全的

      然而在相当多的情况下,你可以证明它是坏的,这很好

      您可能还对自动死锁检测感兴趣,它在某些情况下只是“正常工作”。我在数百台安装了死锁检测器的台式机上发布了一个Java程序,它是一个很棒的工具。例如:

      您还可以通过各种方式对应用程序进行压力测试

      当系统上存在高负载时,伪造的多线程程序往往无法正常工作

      我问了一个问题,关于如何在Un*x系统上轻松创建高CPU负载,例如:

      这是停车问题的一种变体(或所谓的“减少”)。因此,它是可证明不可解的。适用于所有非平凡情况。(是的,这是一个编辑)


      这意味着您可以通过任何常用方法(统计、逻辑)找到错误,但您永远无法完全证明没有错误。

      我想那些说证明任意多线程程序是线程安全的不可能的人在某种程度上是正确的。一个任意的多线程程序,在没有严格指导原则的情况下编写,只会出现线程错误,你无法有效地证明某些错误

      诀窍不是编写任意程序,而是编写一个线程逻辑简单到可能正确的程序。然后可以通过工具明确地验证这一点

      我所知道的最好的工具是。它基于注释或xml配置文件工作。如果将一个方法标记为“@ThreadSafe”,但它不是,则会出现编译时错误。这是通过查看线程不安全操作的字节码来检查的,例如,未同步数据字段上的读/写序列

      它还处理那些需要在特定线程上调用方法的API,例如Swing


      它实际上并不处理死锁,但可以通过使用诸如的工具静态消除死锁,甚至不需要注释。你只需要遵循一些最低标准,比如确保锁是根据DAG获得的,而不是故意的。

      用jmeter测试一下,看看会发生什么,或者使用其他自动化测试工具,也许Grinder,你可以同步整个过程。它不会扩展到多个线程,但也不会因为线程错误而中断。你的目标是没有灾难性的失败吗?相关的问题可能会对@Paul有所帮助:“同步整个过程”并不能保证程序不会中断或死锁。为了编写线程安全的代码,您必须知道自己在做什么,并且要小心;没有神奇的方法。@Grodriquez,关于死锁的观点很好。JMeter(以及几乎所有其他工具)可以帮助您发现问题,但它永远无法验证您的代码是否正确(尤其是多线程代码)。@Joachim Sauer,正是我所说的。它不会显示线程安全问题,但可以发现一些问题。像这样的测试就像单元测试。。。他们不能告诉你代码在哪里是正确的,他们只能告诉你代码在哪里被破坏了。但这并没有降低它们的有用性:)这显然是错误的:单线程程序始终是线程安全的,而检查线程api调用的验证器将在100%的时间内检测非单线程程序。@soru:你是对的。一般来说,它是不可解的,而特定的情况(例如具有单个操作的平凡程序)可以被证明是正确的。不幸的是,那些琐碎到可以轻易证明的东西通常都不够有趣;-)根据我的经验,将程序分为两类是非常有远见的:一类是静态可检查的,另一类是需要删除的,并且它们的作者都在发火。提供一个单一的有限的、非任意的程序缺乏某些缺陷并不是一个停止的等价问题的例子。否则就不会有类型检查编译器之类的东西了。使用jMeter虽然不是防弹的,但确实有助于识别实现的愚蠢之处。我遇到了线程问题,因为某些类的底层有一个静态SimpleDataFormat对象,用于为SQL查询生成日期参数。底层驱动程序一度开始抱怨无效的日期参数,这有助于我识别这个特殊问题。