有這方面知識的朋友,看到題目會認為,你這樣做沒有意義的,因為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?
作者 bd_cool