javascript模拟java中的synchronized同步功能

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 21:49   237   0

  有这方面知识的朋友,看到题目会认为,你这样做没有意义的,因为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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP