使用全局值和竞争条件的函数

时间:2013-12-17 19:11:15

标签: java variables

 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吗?

2 个答案:

答案 0 :(得分:0)

是的竞争条件是可能的(假设它是多线程的)但是基于竞争条件的错误的数量将取决于您设置和引用ID和A的频率。对于生产编码,您应该解决这个问题,对于任何其他用途你也许可以忍受它。

答案 1 :(得分:0)

是的,您可以使用此代码遇到竞争条件,因为类中的静态变量由从同一个类实例化的所有对象共享。

因此,如果ObjectA和ObjectB都是从同一个同时存在的类派生的,而ObjectA将“ID”设置为“123”,那么ObjectB.ID现在也将等于123.如果ObjectB不期望ID改变那样,然后它可能导致竞争条件,或(其他)意外错误。

在多线程的情况下,这个问题可能会/将会大大放大。