java - 如何从多个线程测试一个类的线程安全性?

标签 java multithreading thread-safety

我正在研究线程安全的单例类,我知道下面的代码不是线程安全的,因为我正在双重检查锁定错误。

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/

相关文章:

c# - 计算多个线程中的东西

java - 如何在模板templates.jsp中使用if语句?

java - Play 框架 - 保存模型时出现 Mysql 错误

java - 如何检查 Java 源文件是否有效(没有错误)?

c# - 无符号互锁读取

java - 为什么我们要写Synchronized(ClassName.class)

c++ - 设计问题:std::map 的线程安全

java - NestedTree 上的测试 CheckBox 失败

java - notify() 如何按顺序或随机唤醒线程

c - 将带有数组的结构传递给多个线程