我有以下类(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/