簡單的JavaScript互斥鎖分享_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 : function (lock, action) {
$.indream.async.waitings[lock] = $.indream.async.waitings[lock] .push(action);
//若鎖定使用,則目前action阻塞此鎖定
$.indream .async.lockStatus[lock] = true;
if (arguments.length > 2) { for (var i = 3; i args = ', arguments 🎜> eval('$.indream.async.action.call(action, ' args ')');
} else {
$.indream.async.action.call(action);
}
}
},
//
//解鎖
//lock : 鎖的編號
//
releaseLock: function (lock) {
//若等待佇列有對象,則執行等待隊列,否則解鎖
if ($.indream.async.waitings[lock].length) {
} else {
$.indream.async.lockStatus[lock] = false;
//
//鎖定的狀態
//
//
//且有完成事件完成
//lock:作用 wait: function (lock , action) {
$.indream.async.waitings[code] = $.indream.async.waitings[code] || [];
. );
},
//
//等待序列
//
//資料快取
//
action: {
//
//監控與回復相關的相關方法 //
listen: function (actionName , callback) {
var list = $.indream.async.action.callback. ] = list[actionName] || [];
list[actionName].push(callback );
},
//
var list = $.indream.async.action.callback .list;
if (list[actionName] && list[actionName].leng (var i in list[actionName]) {
地actionName][i], args);
} // list: []
},
//
//使用中使用與參數是否有選擇適當的執行方式 call: function (action) {
if (action) {
if (arguments.length > 1) {
for (var i = 2; i ' i ']';
}
');
} else {
}
}
}
}(window.jQuery);
一個互斥鎖的幾個元素是:
•鎖與解鎖
以上鎖的用法:
var ti ;
var fullTime = 100;
for (timer = 0; timer / fullTime) ');', timer);
}
//釋放鎖
setTimeout('$.indream.async.releaseLock("' lock '");', full); >});
關於這次所的實現,簡單說明下。
-自旋鎖還是信號量
JavaScript本身沒有鎖的功能,所以做的鎖都是在高層實現的。
自旋鎖實現起來的樣子大致上是這樣的,當然do while更多用了:
複製程式碼
while(true) {
> ...
}
這樣必然需要佔滿執行緒資源,可惜JS只有一條執行緒可以用來執行,所以這樣做十分不適用。當然,有需要可以選擇setInterval和clearInterval的組合去實現,效果也會不錯。
這裡選用了信號量的方式,原理也簡單,就如程式碼那麼短。工作的執行順序大致是:
•把程式碼段(回呼的action)推入等待佇列
•判斷目前鎖是否被持有,如果被持有則等待釋放,否則取得該鎖,執行回呼
•當鎖被釋放,則在等待佇列中shift出下一個回調,將鎖定傳遞給它並執行
-自動釋放還是手動釋放
看起來最舒服的方式當然是鎖住之後噹噹前程式執行完就自動釋放,不過這樣並不容易,因為有更多的情況需要自訂釋放場景。
本身使用鎖定的就是在非同步中的方法,所以各種通常也會出現其他非同步內容,例如AJAX、jQuery動畫。這時候,自動釋放就不符合需求了,因為實際上真正的「執行完畢」是在它內部的非同步回調完成後,也就是基本上只有開發人員自己能把握,所以這裡選擇了手釋放。
不過還是有缺陷的,就是重複釋放。
可以看到所有的鎖的物件都是公有的,或者應該說JS所有物件都是公有的,除非使局部變數在存取層級上進行隔離。不過這裡「鎖」本身就是個公共資源,所以沒辦法處理。
這裡可以做的優化應該是像setInterval和clearInterval的那樣,以公共的鎖名稱進行加鎖,以私有的鎖ID進行解鎖,就可以防止重複釋放了。不過上面這段老程式碼中沒有,估計很快就會用到的了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。
