我制作了一个工具并为外部世界提供了一个API,但我不确定它是否是线程安全的。因为用户可能希望在多线程环境中使用它。有没有什么方法或工具可以用来验证我的API在Java中是否是线程安全的?
答案 0 :(得分:17)
否即可。没有这样的工具。证明复杂程序是线程安全的非常困难。
您必须非常仔细地分析您的程序,以确保线程安全。考虑购买“实践中的Java并发”(java中并发性的非常好的解释)。
答案 1 :(得分:6)
压力测试或静态分析工具(如PMD和FindBugs )可以发现中的某些并发错误码。因此,如果您的代码不线程安全,这些可以显示。然而,他们永远无法证明它是否是线程安全的。
最有效的方法是由并发经验的开发人员进行彻底的代码审核。
答案 2 :(得分:1)
答案 3 :(得分:1)
这是暂停问题的变体(或所谓的“减少”)。因此,对于所有非平凡的案例,它都是可证明无法解决的。。 (是的,这是一个编辑)
这意味着您可以通过任何常规手段(统计,逻辑)找到错误,但您永远无法完全证明没有错误。
答案 4 :(得分:1)
我认为那些说证明任意多线程程序是线程安全的人在某种程度上是不正确的。一个任意多线程程序,编码时没有遵循严格的指导原则,只需将具有线程错误,并且您无法有效地证明某些不正确的内容。
诀窍不是编写任意程序,而是使用线程逻辑简单到可能正确的程序。然后可以通过工具明确验证这一点。
我所知道的最好的工具是CheckThread。它基于注释或xml配置文件工作。如果将方法标记为'@ThreadSafe'而不是,则会出现编译时错误。通过查看线程不安全操作的字节代码来检查,例如,在非同步数据字段上读/写序列。
它还处理那些需要在特定线程上调用方法的API,例如:摆动。
它实际上并不处理死锁,但是通过使用诸如Jlint之类的工具,可以静态地消除死锁,甚至不需要注释。您只需遵循一些最低标准,例如确保根据DAG获取锁定,而不是无所不在。
答案 5 :(得分:0)
你不能也永远不能自动证明一个程序是线程安全的,你可以证明程序是正确的(除非你认为你解决了暂停程序,你没有解决)。
所以,不,你无法验证API是线程安全的。
然而在某些情况下,您可以证明它已损坏,这太棒了!
您可能也对自动死锁检测感兴趣,在某种情况下只是“正常工作”。我在数百台桌面上安装了一个Java程序,安装了这样的死锁检测器,这是一个很棒的工具。例如:
http://www.javaspecialists.eu/archive/Issue130.html
您还可以通过各种方式对应用程序进行压力测试。
当系统出现高负载时,Bogus多线程程序往往效果不佳。
以下是我询问如何在Un * x系统上轻松创建高CPU负载的问题,例如: