作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何通过编写一些代码快速证明以下类不是线程安全的(因为它使用延迟初始化而不使用同步)?换句话说,如果我要测试以下类的线程安全性,我怎么会失败?
public class LazyInitRace {
private ExpensiveObject instance = null;
public ExpensiveObject getInstance() {
if (instance == null)
instance = new ExpensiveObject();
return instance;
}
}
最佳答案
根据定义,无法确定性地测试竞争条件,除非您控制线程调度程序(您没有)。您可以做的最接近的事情是在 getInstance()
方法中添加一个可配置的延迟,或者在问题可能出现的地方编写代码并在一段时间内运行它数千次循环。
顺便说一句,这些都不是真正的“证据”。 Formal Verification会,但是非常非常难做到,即使对于相对少量的代码也是如此。
关于java - 证明以下代码不是线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410499/
我是一名优秀的程序员,十分优秀!