`
bd_cool
  • 浏览: 60065 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript模拟java中的synchronized同步功能

 
阅读更多

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

相关推荐

    模拟股票交易系统Java

    在构建一个模拟股票交易系统的过程中,Java作为编程语言是一个常用的选择,因其稳定性和丰富的库支持。这个系统的主要目的是提供一个平台,让用户能够模拟真实的股票市场环境进行交易操作,包括买入、卖出、查看股票...

    Java中ArrayList类的用法.docx

    在JavaScript中,虽然没有内置的ArrayList类,但可以使用Array对象模拟类似的功能,因为Array在JavaScript中是动态的,可以随时添加、删除或修改元素。然而,JavaScript的Array不提供像ArrayList那样的线程同步功能...

    java(applet小动画)

    线程间的同步和通信可能会使用到`synchronized`关键字、wait/notify机制,或者`java.util.concurrent`包下的高级并发工具。 程序中可能会使用到Java的图形库,如`java.awt`和`javax.swing`,来绘制和更新动画的图形...

    java实现当当网

    在本项目中,"java实现当当网"是一个实践性的编程任务,主要目的是通过Java语言来构建一个类似于当当网的在线购物平台。这个任务涵盖了多个Java编程和Web开发的知识点,下面将详细阐述其中涉及的技术和概念。 首先...

    java银行系统完整代码

    6. **多线程与并发控制**:银行系统可能面临大量并发请求,因此需要使用Java的线程机制,如`Thread`类、`ExecutorService`和`synchronized`关键字,来处理多线程环境下的任务执行和同步问题。 7. **Spring框架**:...

    JAVA飞机订票系统源代码

    8. **并发处理**:在多用户环境下,系统需要处理并发请求,使用线程安全的数据结构和同步机制是必不可少的,如synchronized关键字、Lock接口等。 9. **支付集成**:如果系统包含在线支付功能,可能需要集成第三方...

    example8-04.rar_JavaScript/JQuery_Java_

    在gridsim中,我们可能会涉及到Java并发编程,比如线程管理和同步机制,如synchronized关键字和java.util.concurrent包中的工具类。此外,对于分布式系统的模拟,可能还会用到网络通信(如Socket编程)、数据序列化...

    Java项目设计与开发范例

    使用Java的并发库,如ExecutorService,Semaphore等工具,模拟顾客排队等待服务的过程,理解线程安全和同步机制,如synchronized关键字和Lock接口的应用。 3. **网上书店**:这是一个Web应用项目,涵盖了前端页面...

    java课程设计烟花游戏.doc

    线程的同步可以通过`synchronized`关键字或者`wait()`、`notify()`方法来控制。 6. **图形绘制**:在Java中,`Graphics`类用于绘制图形,它提供了一系列的方法来绘制线条、填充形状、设置颜色等。在烟花游戏中,...

    java 售票系统 服务端与客户端

    Java售票系统是一个典型的客户端-服务器(C/S)架构的应用程序,用于模拟车票的售卖和退款过程。在这样的系统中,服务端是处理业务逻辑和数据管理的核心,而客户端则提供用户友好的图形用户界面(GUI)以进行交互...

    DiningPhilospherProblem.zip_Java编程_JavaScript_

    JavaScript中没有类似于Java的`synchronized`关键字,但可以使用闭包、Promise或async/await来保证代码的执行顺序,防止数据竞争。 通过这些技术,我们可以设计出一个有效避免死锁的解决方案,使得哲学家们能够...

    Java程序设计环节考核指导.doc

    对于样题一,学生需修复"a1.java"中的语法错误,理解程序功能并给出运行结果;样题二则要求学生填充空白,完善程序,并解释程序的行为。这样的考核设计旨在全面评估学生的编程技能和问题解决能力。

    模拟 ATM机

    为此,可以使用`synchronized`关键字来同步关键代码段,或者使用`java.util.concurrent`包中的高级并发工具,如`Semaphore`、`ReentrantLock`等。 接着,我们来看看http协议的角色。HTTP(超文本传输协议)是一种...

    java最经典面试题.doc

    #### 十七、JavaScript中数字类型的验证方法 - **使用正则表达式**:如`if (/^\d+(\.\d+)?$/.test(value))`。 - **使用Number.isFinite()**:检查是否为有限数字。 - **使用isNaN()**:检查是否为NaN。 #### 十八...

    java问题定位技术+性能优化

    - 在Java中,单独的`i++`是线程不安全的,除非在`synchronized`块内。 - **4.5 进程线程多,是否就意味着我的程序可以获得更多的CPU?** - 不一定,过多的线程会导致上下文切换频繁,反而降低性能。 - **4.6 线程的数量...

    Google Web Toolkit

    GWT的运行时库模拟了Java运行时库的一个相关子集,提供了在Web环境中执行Java程序所需的功能。这包括但不限于DOM操作、事件处理、AJAX通信等。 ### 四、GWT的优点 1. **跨浏览器兼容性**:GWT生成的JavaScript代码...

    java学习路线.pdf

    - **线程同步**: 使用 synchronized 关键字或 ReentrantLock 来保证线程安全。 - **线程通信**: 如 wait() 和 notify() 方法用于线程间的等待和通知。 **2. Java 并发包的使用** - **Lock**: 提供更灵活的锁定机制...

    design-patterns:Java和js中的单例模式和访客模式已实现

    在软件工程领域,设计模式是解决常见问题的模板或最佳实践,它们被广泛应用于各种编程语言中,包括Java和JavaScript。本项目实现了两种经典的设计模式:单例模式和访客模式。 **单例模式**是一种创建型设计模式,...

    交通信号灯实现程序

    - 为了保证安全,我们需要使用锁(如Java的`synchronized`关键字或互斥量)或信号量来实现线程间的同步,防止状态冲突。 3. **暂停与返回功能**: - 暂停功能可能通过设置一个全局的“开关”变量实现,当该变量为...

Global site tag (gtag.js) - Google Analytics