在多线程中执行静态方法

本文关键字:静态方法 执行 多线程 | 更新日期: 2023-09-27 18:16:04

假设我有一个像下面这样的类:

public static class Foo
{
    public static int Do(int original)
    {
        int result=original + 1;
        return result;
    }
}
public class Bar
{
    public void Invoke()
    {
        int result=Foo.Do(1);
    }
}

谁能告诉我如何在CLR中调用它?我们只知道CLR是一个基于堆栈的虚拟机。调用Foo.Do()方法的实例有自己的调用堆栈。它将一个int参数压入Stack,然后调用Foo.Do()方法。我想知道在多线程中调用Foo.Do()的几个实例是否会相互干扰?每个实例都有一个Foo.Do()的副本?

在多线程中执行静态方法

每个线程都设置了自己的调用堆栈。因此,当您在一个线程中调用函数时,堆栈仅为该线程更改。其他线程可以调用它们想要的任何其他函数,而不会相互影响(除了共享状态,但这是另一个问题)。重要的是堆栈不是共享的。

我想知道在多线程中是否有几个实例调用Foo.Do()会互相干扰?每个实例都有一个Foo.Do()的副本?

在这种情况下,每个实例都可以。单独的线程之间没有数据共享,因为InvokeFoo.Do不依赖于任何其他共享状态。

当您试图在各个线程之间共享数据时,就会出现多线程的主要问题。此时,您需要注意同步对共享数据的访问。

也许你应该看看ThreadLocal API,这样你就可以有一个线程特定的存储。在你的情况下,Reed建议,这应该无关紧要,因为没有共享状态,但如果有,它将作为静态存储在线程之间共享,直到除非它是ThreadLocal