java - 证明这个类是线程安全的?

标签 java multithreading

我必须(使用代码)证明一个类(在 .jar 文件中)不是线程安全的。

我明白这个问题在问什么,我只是不确定如何处理这个问题的编码部分。

最佳答案

证明该类不是线程安全的可以只是一些代码,证明它可以使该类以非线程安全的方式运行。 (存在证明。)

例如,这可能是一个具有两个线程的程序:

  • 一个线程将计数器设置为 N 并 hibernate 。
  • 第二个线程将计数器递减 N 次
  • 第一个线程唤醒并测试计数器是否已耗尽。

重复几次(百、千、百万)次

如果存在线程安全问题,那么耗尽测试可能会给出错误的答案。

但请注意,像这样的线程安全问题的黑盒测试有点碰运气:

  • 测试的实际行为可能会因硬件平台等的不同而有所不同。

  • 如果被测代码被视为黑匣子,您将无法确定它可能存在哪些线程安全问题,或者如何(确切地)触发它们.

  • 在设计这样的测试时,很容易做一些偶然同步......这可以防止线程安全问题显现出来。

您无法清楚地演示线程安全问题这一事实并不意味着它们不存在。您无法通过测试来证明代码是线程安全的。

<小时/>

最后,API 设计显然是不可重入的。由于这些方法是静态,因此只有一个计数器1,并且它一次只能用于一件事。但是,这不是线程安全问题。我将其称为2 API 设计/可用性问题,而不是线程安全问题。

1 - ...除非实现真的很奇怪;例如使用线程局部状态。但是,这应该记录在 API 规范中。

2 - 如果设置考试问题的人并没有真正了解公认的并发术语,他们可能会不同意我的观点。

关于java - 证明这个类是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40558961/

相关文章:

java - 为程序创建 .jar 文件

android - 为什么 native 线程在应用程序处于后台时表现不同?

java - Derby+apache 找不到 main

java - 什么是NullPointerException,我该如何解决?

java - 比较一对 3 个变量的数学方法

multithreading - Delphi 2007 AsyncMultiSync 不起作用

c++ - 在没有多线程的情况下,我的代码更快是正常的,这是我做错了吗?

c# - 一个 C# 异常可以在不同线程上多次引发吗?

c# - 后台线程循环和双向通信

java - 如何从另一个 View 通知android ListView?