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

How do I prevent the simultaneous usage of a static field by the static methods that use it?

好的,您好,这是一个快速而直接的问题示例。

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 将同时在 ClassAClassB 中被 MyTestClass.MethodA 赋值。因此覆盖值集是。

我想要它,这样就不会发生覆盖。

有两点需要指出。 MyTestClass 中的 float 方法必须 保持 静态。 MyTestClassMethodA的结构必须保持不变

我不想相信他是行尾,现在完全不可能做到这一点。我认为一定有办法。如果您有任何想法,请分享。

有两种解决方法:

  • 引入一个局部变量,在计算中使用它,并在最后设置值 - 这会让你在两种方法中计算出正确的结果,因为每个方法都会得到自己存储结果,或
  • 使用锁定 - 这将使并发计算相互等待完成,防止同时写入 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 的最终值将设置为恰好写入它的最后一个值,这是一个任意选择。