声明为另一个类的静态成员的类对象的方法的线程行为

时间:2012-06-05 17:23:20

标签: c# oop static-members instance-methods

最近,我的一位同事提出了一段代码并询问了我对代码的线程安全性的看法。下面的示例说明了与代码相同的场景。

public class classA
{
   public int DoWorkA() 
   { 
       //some logic 
   }
}

public class classB
{
     public static classA objA = new classA();
}

public class classC
{
        int DoWorkC () 
        {

           return classB.objA.DoWorkA();

        }
}

现在如果在ClassC,ClassD等不同类的不同实例中同时调用ClassB.objA.DoWorkA()会有任何线程或“重叠”问题吗? objA应该转换为实例成员吗?

2 个答案:

答案 0 :(得分:2)

由于objA是静态的,因此只有classA的单个实例。这意味着所有线程都访问相同实例上的方法DoWorkA(),但这并不意味着方法调用是线程安全的 - 这完全取决于DoWorkA()的实现

您仍然需要DoWorkA中的适当逻辑来防止并发访问可能出现的问题,例如使用锁定或线程安全的集合等。

答案 1 :(得分:1)

  

会有任何线程或“重叠”问题

这取决于//some logic的作用。每个调用都将共享同一个实例,因此DoWorkA需要是线程安全的才能使其正常运行。

//some logic中使用的任何数据都需要正确同步才能确保安全。