日期:2014-05-16 浏览次数:20327 次
有这方面知识的朋友,看到题目会认为,你这样做没有意义的,因为script脚本永远不会产生并发。确实脚本执行是单线程的,即使有setTimeout、setInterval等方法,他也永远不会产生并发。所以这里只是模拟。
说明一下应用场景,在线考试系统有自动交卷和手工交卷,结构大致如下
function handInAuto(){ doHandIn(); } function handInMan(){ doHandIn(); } function doHandIn(){ ... }
?
我们通常可以在doHandIn方法中,取消定时时钟,并且屏蔽手动的按钮,这样就不会重复执行doHandIn。或者在handInAuto屏蔽手动按钮,在handInMan中取消时钟,也可以。
但总感觉不完美,交卷逻辑掺杂着控制逻辑。就不能像java那样吗?用关键字声明就可以了。
public synchronized void doHandIn(){ ... }
?
?终于实现成如下形式,在代码块外加个jsynchronized("handIn")判断语句。每次调用会锁定一定的时间,从而达到不会连续被执行的目的。
?
function doHandIn(){ if(jsynchronized("handIn")){ ... } }
?
实现代码
/** * js实现同步锁,缺省锁定10秒 * 示例 * if(jsynchronized("handIn")){ ... * } */ var locks = []; var LOCKTIME_DEFAULT = 1000 * 10; function jsynchronized(lockName,lockTime){ if(getLock(lockName)){ return false; }else{ setLock(lockName,true); setTimeout(function(){ setLock(lockName,false); },lockTime?lockTime:LOCKTIME_DEFAULT); return true; } } /** * 获得一个锁,如果没有添加这个锁 */ function getLock(lockName){ for(var i = 0 ; i < locks.length ; i ++){ if(locks[i][0] == lockName){ return locks[i][1]; } } locks[locks.length] = [lockName,false]; return false; } /** * 设置一个锁,如果没有添加这个锁 */ function setLock(lockName,lockValue){ for(var i = 0 ; i < locks.length ; i ++){ if(locks[i][0] == lockName){ locks[i][1] = lockValue; return ; } } locks[locks.length] = [lockName,lockValue]; }
?
这里的"handIn"参数,根据不同的功能区别开就可以了。
?
是不是感觉有点像java的synchronized?
?