静态字段线程是否安全

本文关键字:安全 是否 线程 字段 静态 | 更新日期: 2023-09-27 18:30:41

我们在抽象类中有一个静态字段

抽象类:-

public abstract class BaseController
{
 private static string a;
 private static string b;
 protected abstract SomeArray[] DoSomeThing();
}

和一个派生类

public class Controller1:BaseController
{
      protected override SomeArray[] DoSomthing()
      {
        //////
        In this method we are setting the static variables with different values
      }
}

我们还有一个启动线程的类

public class SomeClass 
{
  public SomeClass()
  {
    '' we are setting the controller we want to call, i mean to decide which base class to call 
  }
   public void Run()
   {
     Thread t  = new Thread(StartThread);
    t.Start();
   }
  public void StartThread()
  {
     _controller.DoSomeThing();
  }
}

上述所有服务都在WCF服务中,并且同一客户端尝试多次调用,这意味着我们同时运行多个线程,我们已经看到了我们正在设置并将其用于某些数据库更新过程的静态变量有时具有错误值的问题

读过一些博客,说静态字段不是线程安全的,一些机构能否帮助我了解我们的代码中可能出现的问题以及为什么我们将一些不正确的值传递给数据库。

静态字段线程是否安全

根据定义,静态字段或成员在该类的所有实例之间共享,只有该字段或成员的一个实例存在;因此,它不是线程安全的。

您有两个选项,要么同步对该字段的访问(基本上是使用 Monitor 类),要么对该字段使用 ThreadStaticAttribute。

但是,我建议重新组织您的类层次结构,以便每个类都有自己的字段或成员实例。

请注意,如果有多个线程在类控制器的同一实例上工作,那么我们回到同一个问题,您应该同步对该实例字段的访问。

祝你好运