如何防止使用它的静态方法同时使用静态字段?
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
将同时在 ClassA
和 ClassB
中被 MyTestClass.MethodA
赋值。因此覆盖值集是。
我想要它,这样就不会发生覆盖。
有两点需要指出。 MyTestClass
中的 float 方法必须 保持 静态。 MyTestClass
中MethodA
的结构必须保持不变
我不想相信他是行尾,现在完全不可能做到这一点。我认为一定有办法。如果您有任何想法,请分享。
有两种解决方法:
- 引入一个局部变量,在计算中使用它,并在最后设置值 - 这会让你在两种方法中计算出正确的结果,因为每个方法都会得到自己存储结果,或
- 使用锁定 - 这将使并发计算相互等待完成,防止同时写入
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
的最终值将设置为恰好写入它的最后一个值,这是一个任意选择。
好的,您好,这是一个快速而直接的问题示例。
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
将同时在 ClassA
和 ClassB
中被 MyTestClass.MethodA
赋值。因此覆盖值集是。
我想要它,这样就不会发生覆盖。
有两点需要指出。 MyTestClass
中的 float 方法必须 保持 静态。 MyTestClass
中MethodA
的结构必须保持不变
我不想相信他是行尾,现在完全不可能做到这一点。我认为一定有办法。如果您有任何想法,请分享。
有两种解决方法:
- 引入一个局部变量,在计算中使用它,并在最后设置值 - 这会让你在两种方法中计算出正确的结果,因为每个方法都会得到自己存储结果,或
- 使用锁定 - 这将使并发计算相互等待完成,防止同时写入
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
的最终值将设置为恰好写入它的最后一个值,这是一个任意选择。