亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

簡單的JavaScript互斥鎖分享

2019-11-20 21:10:20
字體:
來源:轉載
供稿:網友

去年有幾個項目需要使用JavaScript互斥鎖,所以寫了幾個類似的,這是其中一個:

復制代碼 代碼如下:

//Published by Indream Luo
//Contact: indreamluo@qq.com
//Version: Chinese 1.0.0

!function ($) {
    window.indream = window.indream || {};
    $.indream = indream;

    indream.async = {
        //
        //鎖
        //lock: 鎖的編號
        //action: 解鎖后執行的方法
        //
        lock: function (lock, action) {
            $.indream.async.waitings[lock] = $.indream.async.waitings[lock] || [];
            $.indream.async.waitings[lock].push(action);
            //如果該鎖未被使用,則當前action阻塞該鎖
            if (!$.indream.async.lockStatus[lock] && action) {
                $.indream.async.lockStatus[lock] = true;
                if (arguments.length > 2) {
                    var args = 'arguments[2]';
                    for (var i = 3; i < arguments.length; i++) {
                        args += ', arguments[' + i + ']';
                    }
                    eval('$.indream.async.action.call(action, ' + args + ')');
                } else {
                    $.indream.async.action.call(action);
                }
            }
        },
        //
        //解鎖
        //lock: 鎖的編號
        //
        releaseLock: function (lock) {
            $.indream.async.waitings[lock].shift();
            //如果等待隊列有對象,則執行等待隊列,否則解鎖
            if ($.indream.async.waitings[lock].length) {
                $.indream.async.waitings[lock][0]();
            } else {
                $.indream.async.lockStatus[lock] = false;
            }
        },
        //
        //鎖的狀態
        //
        lockStatus: [],
        //
        //等待事件完成
        //lock:鎖編碼,相同的編碼將被整合成一個序列,觸發時同時觸發
        //
        wait: function (lock, action) {
            $.indream.async.waitings[code] = $.indream.async.waitings[code] || [];
            $.indream.async.waitings[code].push(action);
        },
        //
        //等待序列
        //
        waitings: [],
        //
        //數據緩存
        //
        action: {
            //
            //監聽和回調的相關方法
            //
            callback: {
                //
                //監聽
                //
                listen: function (actionName, callback) {
                    var list = $.indream.async.action.callback.list;
                    list[actionName] = list[actionName] || [];
                    list[actionName].push(callback);
                },
                //
                //回調
                //
                call: function (actionName, args) {
                    var list = $.indream.async.action.callback.list;
                    if (list[actionName] && list[actionName].length) {
                        for (var i in list[actionName]) {
                            $.indream.async.action.call(list[actionName][i], args);
                        }
                    }
                },
                //
                //現有的回調列表
                //
                list: []
            },
            //
            //根據方法是否存在和參數是否存在選擇適當的執行方式
            //
            call: function (action) {
                if (action) {
                    if (arguments.length > 1) {
                        var args = 'arguments[1]';
                        for (var i = 2; i < arguments.length; i++) {
                            args += ', arguments[' + i + ']';
                        }
                        eval('action(' + args + ')');
                    } else {
                        action();
                    }
                }
            }
        }
    }
}(window.jQuery);

一個互斥鎖的幾個元素是:

•鎖與解鎖
•等待隊列
•執行方法
以上鎖的用法:

復制代碼 代碼如下:

//定義鎖的名稱
var lock = 'scrollTop()';
//使用鎖
$.indream.async.lock(lock, function () {
    var scrollTop = $(window).scrollTop();
    var timer;
    var fullTime = 100;
    for (timer = 0; timer <= fullTime; timer += 10) {
        setTimeout('$(window).scrollTop(' + (scrollTop * (fullTime - timer) / fullTime) + ');', timer);
    }
    //釋放鎖
    setTimeout('$.indream.async.releaseLock("' + lock + '");', fullTime);
});

關于這次所的實現,簡單說明下。

-自旋鎖還是信號量
JavaScript本身沒有鎖的功能,所以做的鎖都是在高層實現的。

依據JavaScript單線程的原理,JS的線程資源十分有限,非常不適合使用自旋鎖,所以選擇了使用信號量。

自旋鎖實現起來的樣子大致是這樣的,當然do while更多用了:

復制代碼 代碼如下:

while(true) {
    //do something...
}

這樣必然需要占滿線程資源,可惜JS只有一條線程可以用來執行,所以這樣做十分不適用。當然,有需要可以選擇setInterval和clearInterval的組合去實現,效果也會不錯。

這里選用了信號量的方式,原理也簡單,就如代碼那么短。工作的執行順序大致是:

•把代碼段(回調的action)推入等待隊列
•判斷當前鎖是否被持有,如果被持有則等待釋放,否則獲取該鎖,執行回調
•當鎖被釋放,則在等待隊列中shift出下一個回調,將鎖傳遞給它并執行
 

-自動釋放還是手動釋放
看起來最舒服的方式當然是鎖住之后當當前程序執行完就自動釋放,不過這樣并不容易,因為有更多的情況需要自定義釋放場景。

本身使用鎖的就是在異步中的方法,所以各種通常也會出現其他異步內容,比如AJAX、jQuery動畫。這個時候,自動釋放就不符合需求了,因為實際上真正的“執行完畢”是在它內部的異步回調完成后,也就是基本上只有開發人員自己能把握,所以這里選擇了手釋放。

不過還是有缺陷的,就是重復釋放。

可以看到所有的鎖的對象都是公有的,或者應該說JS所有對象都是公有的,除非使局部變量在訪問級別上進行隔離。不過這里“鎖”本身就是個公共資源,所以沒辦法處理。

這里可以做的優化應該是像setInterval和clearInterval的那樣,以公共的鎖名稱進行加鎖,以私有的鎖ID進行解鎖,就可以防止重復釋放了。不過上面這段老代碼中沒有,估計很快就會用到的了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区三区乱码aⅴ蜜桃女| 久久精品小视频| 蜜臀久久99精品久久久无需会员| 亚洲色图第一页| 97人人模人人爽人人喊中文字| 久久全国免费视频| 成人乱色短篇合集| 精品国产乱码久久久久久婷婷| 国产精品伦子伦免费视频| 日韩成人中文字幕在线观看| 最近免费中文字幕视频2019| 精品国偷自产在线视频99| 国产精品久久久久久久av大片| 欧美日韩午夜剧场| 欧美日韩免费观看中文| 深夜福利日韩在线看| 精品成人av一区| 亚洲va久久久噜噜噜久久天堂| 日韩欧美成人免费视频| 国产精自产拍久久久久久| 成人欧美一区二区三区黑人孕妇| 国产精品香蕉在线观看| 亚洲欧美日韩综合| 国产精品第一视频| 2020久久国产精品| 国产伦精品免费视频| 久久久久久国产精品美女| 中文字幕日韩欧美精品在线观看| 日韩精品电影网| 久久人体大胆视频| 国产美女扒开尿口久久久| 国自在线精品视频| 日韩精品中文字幕久久臀| 成人中文字幕+乱码+中文字幕| 国产精品自拍偷拍视频| 亚洲国产精品久久| 亚洲欧美999| 欧美激情精品久久久久久蜜臀| 欧美在线播放视频| 国产精品久久久久久av福利| 欧美怡春院一区二区三区| 一区二区三区www| 色综合色综合久久综合频道88| 久久频这里精品99香蕉| 欧美激情精品久久久久久大尺度| 久久久免费电影| 久久99热精品| 91久久久久久久久久久| 欧美日韩中文在线| 亚洲成av人片在线观看香蕉| 亚洲精品www久久久久久广东| 欧美亚州一区二区三区| 国产精品视频一区二区三区四| 日本成人激情视频| 久久久久久网址| 日韩精品中文字幕在线播放| 日韩在线观看免费av| 92裸体在线视频网站| 色综合伊人色综合网| 日韩一区二区三区在线播放| 色无极影院亚洲| 精品久久久久久中文字幕| 亚洲色图综合久久| 欧美在线播放视频| 亚洲国产精品系列| 亚洲综合在线中文字幕| 国内免费精品永久在线视频| 精品综合久久久久久97| 成人免费网站在线观看| 日韩中文字幕精品视频| 久久久国产成人精品| 丁香五六月婷婷久久激情| 成人欧美一区二区三区黑人孕妇| 久久久国产视频91| 伦理中文字幕亚洲| 欧美电影电视剧在线观看| 欧美丝袜一区二区三区| 中文字幕精品www乱入免费视频| 欧美成人在线免费| 国模精品一区二区三区色天香| 视频在线观看一区二区| 欧美日韩成人网| 色哟哟网站入口亚洲精品| 九九九久久国产免费| 久久成人国产精品| 日韩精品在线观| 欧美一区二区三区免费视| 亚洲人成77777在线观看网| 在线播放国产一区中文字幕剧情欧美| 在线国产精品播放| 欧美在线中文字幕| 国产成人精品视| 精品人伦一区二区三区蜜桃免费| 亚州国产精品久久久| 亚洲xxxx做受欧美| 91九色综合久久| 亚洲xxxx在线| 亚洲free性xxxx护士白浆| 日韩av在线免费看| 91久久国产精品91久久性色| 青青在线视频一区二区三区| 欧美日韩国产二区| 日韩欧美第一页| 亚洲第一精品夜夜躁人人爽| 日韩在线欧美在线国产在线| 97激碰免费视频| 精品无人国产偷自产在线| 国产91色在线|免| 精品高清美女精品国产区| 亚洲一区二区福利| 亚洲久久久久久久久久久| 日韩中文字幕国产| 91欧美精品午夜性色福利在线| 91在线观看免费| 亚洲第一区在线观看| 国产精品免费一区二区三区都可以| 国产91精品久久久久久久| 亚洲福利小视频| 色香阁99久久精品久久久| 色综合久久中文字幕综合网小说| 欧美夫妻性生活视频| 欧美日韩在线影院| 国产丝袜一区二区三区| 久久精品视频在线观看| 欧美午夜精品在线| 国产精品久久久久久久9999| 久久91超碰青草是什么| 亚洲成av人乱码色午夜| 日韩高清电影免费观看完整| 日本成人免费在线| 亚洲国产精品成人av| 日韩在线中文字| 日本不卡免费高清视频| 国产a∨精品一区二区三区不卡| 亚洲视频电影图片偷拍一区| 欧美成人激情视频免费观看| 亚洲欧美一区二区三区情侣bbw| 国产精品99久久久久久白浆小说| 亚洲国产精品久久久久秋霞蜜臀| 亚洲国产免费av| 欧美午夜性色大片在线观看| 亚洲91av视频| 一本色道久久88综合亚洲精品ⅰ| 亚洲第一福利网| 日韩视频免费在线观看| 国产精品久久久久久亚洲调教| 成人欧美在线观看| 精品动漫一区二区三区| 成人黄色免费片| 成人免费视频97| www.xxxx精品| 欧美大片在线看免费观看| 成人中心免费视频| 国产一区av在线| 欧美亚洲激情在线| 国自在线精品视频| 欧美电影院免费观看| 精品国产一区二区三区久久狼5月| 国产精品视频久久久久| 欧美裸体男粗大视频在线观看| 日韩不卡在线观看| 日韩美女视频免费在线观看| 欧美寡妇偷汉性猛交| 欧美性猛交xxxx乱大交3|