我正在研究线程安全的单例类,我知道下面的代码不是线程安全的,因为我正在双重检查锁定错误。
protected static TestSingleton instance;
private TestSingleton() {
// some code
}
public static synchronized void setup() {
if (instance == null) {
TestSingleton holder = new TestSingleton();
instance = holder;
}
}
public static TestSingleton getInstance() {
if (instance == null) {
setup();
}
return instance;
}
但我正在尝试对此进行测试,以便我可以通过编程方式证明这不是线程安全类。这是我的学习经验。
我如何以编程方式测试它并证明它不是线程安全的?
最佳答案
归结为:您的程序有一定数量的线程,运行在一定数量的处理器上,但您的计算机只有一个主内存。
每个线程将按照某种顺序读写不同的内存位置,这在某种程度上独立于其他线程正在做什么;并且所有这些读取和写入都必须序列化,因为它们会传到内存中。也就是说,内存系统必须一个接一个地执行这些读取和写入操作。
对于多线程程序的任何给定执行,可以有无数种不同的方式来序列化不同线程的操作。从字面上看,太多了。即使其中一种可能的序列化导致您的程序产生错误的输出,那么您的程序就不是线程安全的。
那么如何测试所有这些呢?
你不能。它们太多了,在一台计算机(例如,您客户的关键任务服务器)上可能经常发生的序列化可能永远不会在其他计算机(例如,您的测试工具)上发生。
确保线程安全的唯一方法是使用经过数学验证的算法来同步线程的操作,这样就不会发生错误的交错。
关于java - 如何从多个线程测试一个类的线程安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34319846/