JAVA同步锁的目地_js模拟java同步锁

有这方面知识的朋友,看到题目会认为,你这样做没有意义的,因为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?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值