class {
public static int ID = 1000;
public static int A = 1;
public void onDestroyed(World world, int x, int y, int z, int m) {
ID = 1000;
A = 1;
//Some stuff that will generate X;
while (X > 0) {
//Scanning through arrays to find proper ID (it will lower X by some value until it find good ID)
X = X - ChanceList.get(i - 1);
ID = DropList.get(i - 1);
--i;
}
if (ID != 1000) //ID has changed
{
world.set(x, y, z, ID, 0, 2);
A = 0;
}
}
public int quantityDropped(Random par1Random) //This is called by world.set, after onDestroyed() is done
{
return A;
}
}
短: ID = 1000 => onDestroyed()=> if(ID已经改变)A = 0,if(ID是否相同)A = 1; => quantityDropped()=>根据全局A返回1或0。
问题:如果多次调用此类(函数)(大约每秒10次),并且操作定义为:“通过数组扫描”权重不超过1000个增量。
我可以在这里获得race condition吗?
答案 0 :(得分:0)
是的竞争条件是可能的(假设它是多线程的)但是基于竞争条件的错误的数量将取决于您设置和引用ID和A的频率。对于生产编码,您应该解决这个问题,对于任何其他用途你也许可以忍受它。
答案 1 :(得分:0)
是的,您可以使用此代码遇到竞争条件,因为类中的静态变量由从同一个类实例化的所有对象共享。
因此,如果ObjectA和ObjectB都是从同一个同时存在的类派生的,而ObjectA将“ID”设置为“123”,那么ObjectB.ID现在也将等于123.如果ObjectB不期望ID改变那样,然后它可能导致竞争条件,或(其他)意外错误。
在多线程的情况下,这个问题可能会/将会大大放大。