做手头的工作时,碰到一个互斥访问的问题,描述如下:在页面中,会周期性地调用一个函数(函数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进行操作。
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进行操作。
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);实在是看不出来有啥问题。
isLocked
isLock