最近,我的一位同事提出了一段代码并询问了我对代码的线程安全性的看法。下面的示例说明了与代码相同的场景。
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应该转换为实例成员吗?
答案 0 :(得分:2)
由于objA
是静态的,因此只有classA
的单个实例。这意味着所有线程都访问相同实例上的方法DoWorkA()
,但这并不意味着方法调用是线程安全的 - 这完全取决于DoWorkA()
的实现
您仍然需要DoWorkA
中的适当逻辑来防止并发访问可能出现的问题,例如使用锁定或线程安全的集合等。
答案 1 :(得分:1)
会有任何线程或“重叠”问题
这取决于//some logic
的作用。每个调用都将共享同一个实例,因此DoWorkA
需要是线程安全的才能使其正常运行。
//some logic
中使用的任何数据都需要正确同步才能确保安全。