ホームページ > 記事 > ウェブフロントエンド > シンプルな JavaScript ミューテックス ロックの共有_JavaScript スキル
昨年、JavaScript ミューテックス ロックの使用を必要とするプロジェクトがいくつかあったため、これはそれらの 1 つです。
!function ($) {
window.indream = window.indream || {};
$.indream = indream;
indream.async = {
) .push(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 ']';
args ')'); /lock: ロック番号
その後、待機キューを実行します。それ以外の場合は、
if ($ .indream.async.waitings [lock] .Length) {
$ .indream.async.waitings [lock] [0] のロックを解除します。 ]();
} else {
🎜> lockstatus:[]、
//
(lock、action){
$ .indream.async.waitings [code] = $。 indream.async.waitings[code] || [];
$.indream.async.waitings[code].push (アクション);
},
//
: {
//
listen: function (actionName , callback) {
sync var list = $.indream.a .アクション.コールバック。 list;
list[actionName] = list[actionName] || [];
.push(callback );
},
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);
//既存の呼び出しバックリスト
//
リスト: []
}、
(arguments.length > 1) 🎜> var args = 'arguments[1]';
for (var i = 2; i
}
}
}
}(window.jQuery);
ミューテックスの要素は次のとおりです:
•ロックとロック解除
•待機キュー
•実行方法
上記ロックの用途:
コードは次のとおりです:
//ロックの名前を定義します
//lock を使用します
while(true) {
/ /何かをしてください ...}
これは必然的にスレッド リソースを占有しますが、残念ながら、JS には実行用のスレッドが 1 つしかないため、これは非常に不適切です。もちろん、必要に応じて、setIntervalとclearIntervalの組み合わせを選択して実装することもでき、効果は良好です。
ここではセマフォ方式が使用されており、原理はシンプルでコードも短いです。作業の実行順序は大まかに次のとおりです:
• コード セグメント (コールバック アクション) を待機キューにプッシュします
• 現在のロックが保持されているかどうかを判断し、保持されている場合は解放を待ち、そうでない場合はロックを取得してコールバックを実行します
•ロックが保持されている場合、解放し、待機キュー内の次のコールバックをシフトアウトし、それにロックを渡し、
-自動リリースまたは手動リリース
もちろん、最も快適な方法は、ロックして、現在のプログラムの実行時に自動的にリリースすることですが、カスタマイズされたリリース シナリオが必要な状況がより多く存在するため、これは簡単ではありません。 。
ロックを使用するメソッドは非同期であるため、AJAX や jQuery アニメーションなど、他のさまざまな非同期コンテンツが通常表示されます。現時点では、自動リリースは要件を満たしていません。実際には、実際の「実行が完了する」のは内部の非同期コールバックが完了した後であるため、つまり、基本的に開発者のみが制御できるため、ここでは手動リリースが選択されています。
しかし、依然として欠陥があり、リリースが繰り返されています。
ローカル変数がアクセス レベルで分離されていない限り、すべてのロック オブジェクトがパブリックであることがわかります。または、すべての JS オブジェクトがパブリックであると言うべきです。ただし、ここでの「ロック」自体は公共のリソースであるため、対処する方法はありません。
ここで実行できる最適化は、setInterval や clearInterval のように、パブリック ロック名でロックし、プライベート ロック ID でロックを解除して、繰り返しリリースされないようにする必要があります。ただし、上記の古いコードには含まれていないため、すぐに使用されると推定されます。