java - 如何测试静态方法是否线程安全

标签 java multithreading static

我有以下类(class):

public  class MyTestThreadStatic {

    private static int myNum;

        private MyTestThreadStatic () { // private constructor
        }
        public static void setMyNum(int val) {
            myNum = val;
        }
        public static int addOne() {
            return myNum + 1;
        }

......

code block {
//thread 1 at t0
... some code to create a thread to call static class
System.out.println("val=" + MyTestThreadStatic.addOne());
... some other code to create a thread to call static class
//thread 2 at t0
MyTestThreadStatic.setMyNum(200);
System.out.println("val=" + MyTestThreadStatic.addOne());
}

        //stack created?

在 t0(时间 0),两个线程调用函数 addOne。这会按预期工作吗?它会因为创建了两个堆栈而起作用吗?我想对此进行测试并查看 Thread 和 Runnable,但我没有看到任何方法,因为它们都没有静态方法并且需要对象实例。

最佳答案

它不是线程安全的,也不试图做到线程安全。

测试无法证明代码是线程安全的。它只能尝试证明它不是线程安全的。

为了证明它不是线程安全的,你只需要像这样重新排列代码行

System.out.println("val=" + MyTestThreadStatic.addOne()); // Thread 1

MyTestThreadStatic.setMyNum(200); // thread 2
System.out.println("val=" + MyTestThreadStatic.addOne()); // thread 2

由于每个线程都可以按任何顺序执行,因此您可以像这样运行代码

MyTestThreadStatic.setMyNum(200); // thread 2
System.out.println("val=" + MyTestThreadStatic.addOne()); // Thread 1
System.out.println("val=" + MyTestThreadStatic.addOne()); // thread 2

现在两个线程打印相同的内容。

证明代码线程安全的唯一方法是理解它,并确定当多个线程访问它时,无论每个线程的执行顺序如何,都不会出现错误。

关于java - 如何测试静态方法是否线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40163017/

相关文章:

c# - 在Asp.net MVC Controller 上执行异步OnAction

c++ - static 关键字及其在 C++ 中的各种用途

java - 如何初始化一个静态数组?

java - 如何从 Java 小程序更新我的 MySQL 数据库?

java - mongo中根据出现次数排序

java - 调试时无法实例化 Activity 问题

multithreading - 如何使用协程懒惰地迭代一个大(大于内存)的 kotlin 序列

python - 从多处理转移到线程

c++ - C++ 全局初始化可以有多惰性?