我必须(使用代码)证明一个类(在 .jar 文件中)不是线程安全的。
我明白这个问题在问什么,我只是不确定如何处理这个问题的编码部分。
最佳答案
证明该类不是线程安全的可以只是一些代码,证明它可以使该类以非线程安全的方式运行。 (存在证明。)
例如,这可能是一个具有两个线程的程序:
- 一个线程将计数器设置为 N 并 hibernate 。
- 第二个线程将计数器递减 N 次
- 第一个线程唤醒并测试计数器是否已耗尽。
重复几次(百、千、百万)次
如果存在线程安全问题,那么耗尽
测试可能会给出错误的答案。
但请注意,像这样的线程安全问题的黑盒测试有点碰运气:
测试的实际行为可能会因硬件平台等的不同而有所不同。
如果被测代码被视为黑匣子,您将无法确定它可能存在哪些线程安全问题,或者如何(确切地)触发它们.
在设计这样的测试时,很容易做一些偶然同步......这可以防止线程安全问题显现出来。
您无法清楚地演示线程安全问题这一事实并不意味着它们不存在。您无法通过测试来证明代码是线程安全的。
<小时/>最后,API 设计显然是不可重入的。由于这些方法是静态
,因此只有一个计数器1,并且它一次只能用于一件事。但是,这不是线程安全问题。我将其称为2 API 设计/可用性问题,而不是线程安全问题。
1 - ...除非实现真的很奇怪;例如使用线程局部状态。但是,这应该记录在 API 规范中。
2 - 如果设置考试问题的人并没有真正了解公认的并发术语,他们可能会不同意我的观点。
关于java - 证明这个类是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40558961/