如何防止静态方法同时使用静态字段?

时间:2015-09-27 15:46:14

标签: c# methods static field

好的嗨这里是一个快速直截了当的问题点。

public class MyTestClass
{

    private static float FloatField;

    public static float MethodA( float yourFloat)
    {
        FloatField = yourFloat / 10 * 0.125f;
        return FloatField;
    }

    public void SomeOther_Non_Static_Method()
    {

    }
}

public class ClassA
{
    float FloatA;
    void Running()
    {
     FloatA =  MyTestClass.MethodA(1.2f);

    }
}

public class ClassB
{
    float FloatB;
    void Running()
    {
        FloatB = MyTestClass.MethodA(8.4f);

    }
}

正如您所知,FloatField将同时在MyTestClass.MethodAClassA ClassB分配一个值。因此,覆盖设置的值可以是。

我希望它不会发生重叠。

要指出一些事情。 MyTestClass中的浮动方法必须保持静态。 MethodAMyTestClass的结构必须保持不变

我不想相信自己已经走到尽头了,现在完全不可能做到这一点。我认为必须有办法。如果您有任何想法,请分享。

1 个答案:

答案 0 :(得分:1)

有两种方法:

  • 引入一个局部变量,在计算中使用它,并在最后设置值 - 这样可以让你在两种方法中计算出正确的结果,因为每个方法都会获得自己的存储空间。结果,或
  • 使用锁定 - 这会使并发计算等待彼此完成,从而阻止同时写入FloatField

这是第一种方法:

public static float MethodA( float yourFloat) {
    var temp = yourFloat / 10 * 0.125f;
    FloatField = temp;
    return temp;
}

这是第二种方法:

private static Object floatFieldLock = new Object();

public static float MethodA( float yourFloat) {
    lock (floatFieldLock) {
        FloatField = yourFloat / 10 * 0.125f;
        return FloatField;
    }
}

这两种方法都将解决在同时调用MethodA时返回错误结果的问题。这两种方法都不会解决固有的竞争条件,因为FloatField的结束值将被设置为写入它的最后一个值,这是一个随意的选择。