日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

简单的JavaScript互斥锁

發布時間:2024/1/23 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单的JavaScript互斥锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

去年有幾個項目需要使用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進行解鎖,就可以防止重復釋放了。不過上面這段老代碼中沒有,估計很快就會用到的了。

?

總結

以上是生活随笔為你收集整理的简单的JavaScript互斥锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色婷婷综合久久久久中文字幕 | 日韩女优在线视频 | 成人日批视频 | 成人看的毛片 | 欧美一级爆毛片 | 日本黄色一区二区三区 | 182tv午夜福利在线观看 | av综合色 | 国产精品一区二区三区久久 | 91亚洲综合 | 男女叼嘿视频 | 一区不卡av | 午夜影院免费视频 | 91gao| 99爱精品 | 麻豆短视频在线观看 | 国产又黄又爽视频 | 三女警花合力承欢猎艳都市h | 免费一级a毛片夜夜看 | 女生毛片| 成人污污视频在线观看 | 波多在线播放 | 国产女厕一区二区三区在线视 | 色偷av| 国产片在线播放 | 久久久久一 | 久久国产香蕉 | 亚洲综合一二三 | 色呦呦精品 | 国产91热爆ts人妖在线 | 成人在线直播 | 一级全黄男女免费大片 | 亚洲第一福利视频 | 免费成人在线播放 | 国产视频123 | 日韩不卡一区二区 | 久久激情网站 | 99国产免费| 99国产精品久久久久久久成人热 | 欧美激情一区二区三区免费观看 | 久久另类ts人妖一区二区 | 欧美成人猛片aaaaaaa | 欧美爽爽 | 欧美日韩在线免费观看视频 | 国产jizz18女人高潮 | 美女光屁屁露胸胸 | 成人小片 | 九九碰 | 女生喷液视频 | av福利在线播放 | 夜夜爽日日澡人人添 | 成人片在线播放 | 好爽…又高潮了毛片免费看 | 成年人网站免费看 | 久草福利在线观看 | 黄骗免费网站 | 亚洲91在线 | h色视频在线观看 | 国产香蕉在线视频 | 污污视频网站在线免费观看 | 特级西西www444人体聚色 | 久艹在线观看视频 | 色香蕉影院 | 欧美自拍在线 | 国产成人综合网 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 91手机在线视频 | 日本少妇色视频 | 四虎永久网址 | 四季av国产一区二区三区 | 亚洲精品一区二区三区精华液 | 日韩熟妇一区二区三区 | 久久久国 | av导航站| 五月天激情影院 | 国产三区精品 | 亚洲欧美伊人 | 成人精品一区二区三区 | 91禁在线看 | 中文字幕第88页 | 一级黄色a毛片 | 日本xxxwww| 亚洲欧美日韩综合一区二区 | 亚洲少妇自拍 | 日韩视频免费观看高清完整版 | 哺乳期给上司喂奶hd | 亚洲一区二区人妻 | 看特级黄色片 | 国产精品成人免费视频 | 就要日就要操 | 午夜看黄神器 | 人妻久久一区二区 | 中国黄色片子 | 黄色a网站| www.com毛片| 久久国产视频精品 | 蜜臀在线视频 | 久久国产精品一区二区三区 | 精品孕妇一区二区三区 |