做手头的工作时,碰到一个互斥访问的问题,描述如下:在页面中,会周期性地调用一个函数(函数A)对一个表格 (记作tableA) 进行操作(添加或删除行), 此外,在页面中,有一个button,按了之后会调用另外一个函数(函数B)对tableA进行操作。因为函数A是在后台周期性调用的,所以不知道它什么时候被调用。这样,就有可能在按button调用函数B操作表格的时候,函数A正在对表格进行操作。这就会带来混乱和错误。为了解决这个问题,我试图通过给表格加上一个锁的方式来解决,代码如下:var isLocked = false;function A () {
   if (isLocked == false) {
      isLocked = true;
      /* *************
      *******do something******
      ******************* */
      isLock = false;
    }
}function B () {
    if (isLocked == false) {
       isLocked = true;
      /* *************
      *******do something******
      ******************* */
      isLock = false;
     }
     else {
       setTimeout("B()", 2000);
     }
}setInterval("A()", 5000);这段代码我看着觉得没啥问题,可是却发现实际的运行情况跟我的预期很不一致,表格还是经常处于混乱错误的状态,而且有时候好像一直停在函数B里出不来了。我在想,是不是在setTimeout("B()", 5000)等待的这5秒钟里,并没有能够去继续执行函数A以释放锁,导致isLocked一直处于true的状态? 或者是其他什么原因? 请各位指教!问题补充:函数A和函数B里面都调用了异步Ajax“$.getJSON”,在$.getJSON的回调函数里面对tableA进行操作。

解决方案 »

  1.   

    试试把isLock = false;放到回调函数的末尾。
      

  2.   

    在我的代码里面,isLocked = false就是放在$.getJSON回调函数的末尾的。
      

  3.   

    实际的代码像这个样子:var isLocked = false;function A () {
       if (isLocked == false) {
          isLocked = true;
          $.getJSON(..., function(data) {
            /* *************
            *******do something******
            ******************* */
            isLock = false;
          });
        }
    }function B () {
        if (isLocked == false) {
           isLocked = true;
          $.getJSON(..., function(data) {
            /* *************
            *******do something******
            ******************* */
            isLock = false;
           });
         }
         else {
           setTimeout("B()", 2000);
         }
    }setInterval("A()", 5000);实在是看不出来有啥问题。
      

  4.   

    是否是变量名不一致的原因?
    isLocked
    isLock