java – 测试应用程序是否是线程安全的
我有简单的应用程序,模拟从一个帐户到另一个帐户的汇款.我想写一个测试,表明它不是线程安全的. 线程有可能以这样的方式进行,即传输将进行两次.两个线程场景: > acc1 = 1000 $ > T1:获得acc1余额(1000) 目前我的应用程序不支持多线程,它应该失败,现在对我来说没问题.我能够使用调试器模拟错误.但是,当我进行线程测试时,它总是成功的.我试过不同数量的线程,睡眠,callabletasks
这是汇款代码:
最佳答案
欢迎来到多线程的精彩世界.正如评论所指出的那样,如果没有完整的源代码,就很难确定一种证明任何东西的方法.
但也很难引发线程错误.多线程的第一条规则是你不能通过练习(例如单元)测试证明(或容易反驳)代码是线程安全的. 不安全的代码可以执行十亿次而不会出错.在某些平台上,它实际上可能是线程安全的,但在其他平台上则一致地失败.当您开始使用线程时,所有Java代码在所有平台上的行为相同的想法都会失控. 此代码(您的类的发明内容)在Java中不保证是线程安全的:
但它也是如此小的一段代码,它可能在某些平台上是安全的,或者只是如此之快,它运行数十亿次而没有错误.
很有可能最终在大多数平台上失败.但那又怎么样? 验证或使多线程代码无效的唯一方法是静态分析和对语言保证的良好了解. 您可以尝试以高负载运行(比如)您的平台实际并行运行的线程数量的两倍,并对您很有可能引发问题的底层代码进行一些猜测.但有些错误可能只发生在低负载或其间的任何负载. 请记住,如果您修改代码重新测试并且它工作正常,您就没有证明什么.我不是说你不应该做最后检查这样的测试. 但是,从来没有想过单元测试有助于证明多线程的可靠性,它们有助于单线程.这尤其是因为不同的平台可能具有不同的配置(例如,进程数,高速缓存级别,核心)并且经历不同级别的负载. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Java compareTo()方法返回classCastException
- 使用async / await将现有C#同步方法转换为异步?
- JSP Request.getAttributeNames()方法:返回所有属性的名字
- java – 如何从LinkedHashSet获取前5个值?
- 详解spring cloud分布式整合zipkin的链路跟踪
- fastJson解析复杂对象时碰到的问题
- java – NUMA架构如何影响ActivePivot的性能?
- java – TimeZone.getTimeZone(“CST”)返回GMT
- Java Try / Catch问题
- JAVA实现基于Tcp协议的简单Socket通信实例