有这方面知识的朋友,看到题目会认为,你这样做没有意义的,因为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?
分享到:
相关推荐
在构建一个模拟股票交易系统的过程中,Java作为编程语言是一个常用的选择,因其稳定性和丰富的库支持。这个系统的主要目的是提供一个平台,让用户能够模拟真实的股票市场环境进行交易操作,包括买入、卖出、查看股票...
在JavaScript中,虽然没有内置的ArrayList类,但可以使用Array对象模拟类似的功能,因为Array在JavaScript中是动态的,可以随时添加、删除或修改元素。然而,JavaScript的Array不提供像ArrayList那样的线程同步功能...
线程间的同步和通信可能会使用到`synchronized`关键字、wait/notify机制,或者`java.util.concurrent`包下的高级并发工具。 程序中可能会使用到Java的图形库,如`java.awt`和`javax.swing`,来绘制和更新动画的图形...
在本项目中,"java实现当当网"是一个实践性的编程任务,主要目的是通过Java语言来构建一个类似于当当网的在线购物平台。这个任务涵盖了多个Java编程和Web开发的知识点,下面将详细阐述其中涉及的技术和概念。 首先...
6. **多线程与并发控制**:银行系统可能面临大量并发请求,因此需要使用Java的线程机制,如`Thread`类、`ExecutorService`和`synchronized`关键字,来处理多线程环境下的任务执行和同步问题。 7. **Spring框架**:...
8. **并发处理**:在多用户环境下,系统需要处理并发请求,使用线程安全的数据结构和同步机制是必不可少的,如synchronized关键字、Lock接口等。 9. **支付集成**:如果系统包含在线支付功能,可能需要集成第三方...
在gridsim中,我们可能会涉及到Java并发编程,比如线程管理和同步机制,如synchronized关键字和java.util.concurrent包中的工具类。此外,对于分布式系统的模拟,可能还会用到网络通信(如Socket编程)、数据序列化...
使用Java的并发库,如ExecutorService,Semaphore等工具,模拟顾客排队等待服务的过程,理解线程安全和同步机制,如synchronized关键字和Lock接口的应用。 3. **网上书店**:这是一个Web应用项目,涵盖了前端页面...
线程的同步可以通过`synchronized`关键字或者`wait()`、`notify()`方法来控制。 6. **图形绘制**:在Java中,`Graphics`类用于绘制图形,它提供了一系列的方法来绘制线条、填充形状、设置颜色等。在烟花游戏中,...
Java售票系统是一个典型的客户端-服务器(C/S)架构的应用程序,用于模拟车票的售卖和退款过程。在这样的系统中,服务端是处理业务逻辑和数据管理的核心,而客户端则提供用户友好的图形用户界面(GUI)以进行交互...
JavaScript中没有类似于Java的`synchronized`关键字,但可以使用闭包、Promise或async/await来保证代码的执行顺序,防止数据竞争。 通过这些技术,我们可以设计出一个有效避免死锁的解决方案,使得哲学家们能够...
对于样题一,学生需修复"a1.java"中的语法错误,理解程序功能并给出运行结果;样题二则要求学生填充空白,完善程序,并解释程序的行为。这样的考核设计旨在全面评估学生的编程技能和问题解决能力。
为此,可以使用`synchronized`关键字来同步关键代码段,或者使用`java.util.concurrent`包中的高级并发工具,如`Semaphore`、`ReentrantLock`等。 接着,我们来看看http协议的角色。HTTP(超文本传输协议)是一种...
#### 十七、JavaScript中数字类型的验证方法 - **使用正则表达式**:如`if (/^\d+(\.\d+)?$/.test(value))`。 - **使用Number.isFinite()**:检查是否为有限数字。 - **使用isNaN()**:检查是否为NaN。 #### 十八...
- 在Java中,单独的`i++`是线程不安全的,除非在`synchronized`块内。 - **4.5 进程线程多,是否就意味着我的程序可以获得更多的CPU?** - 不一定,过多的线程会导致上下文切换频繁,反而降低性能。 - **4.6 线程的数量...
GWT的运行时库模拟了Java运行时库的一个相关子集,提供了在Web环境中执行Java程序所需的功能。这包括但不限于DOM操作、事件处理、AJAX通信等。 ### 四、GWT的优点 1. **跨浏览器兼容性**:GWT生成的JavaScript代码...
- **线程同步**: 使用 synchronized 关键字或 ReentrantLock 来保证线程安全。 - **线程通信**: 如 wait() 和 notify() 方法用于线程间的等待和通知。 **2. Java 并发包的使用** - **Lock**: 提供更灵活的锁定机制...
在软件工程领域,设计模式是解决常见问题的模板或最佳实践,它们被广泛应用于各种编程语言中,包括Java和JavaScript。本项目实现了两种经典的设计模式:单例模式和访客模式。 **单例模式**是一种创建型设计模式,...
- 为了保证安全,我们需要使用锁(如Java的`synchronized`关键字或互斥量)或信号量来实现线程间的同步,防止状态冲突。 3. **暂停与返回功能**: - 暂停功能可能通过设置一个全局的“开关”变量实现,当该变量为...