ホームページ  >  記事  >  ウェブフロントエンド  >  シンプルな JavaScript ミューテックス ロックの共有_JavaScript スキル

シンプルな JavaScript ミューテックス ロックの共有_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 17:01:412013ブラウズ

昨年、JavaScript ミューテックス ロックの使用を必要とするプロジェクトがいくつかあったため、これはそれらの 1 つです。

コードをコピー コードは次のとおりです:

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

!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 args = ', argument[' i ']';
}
}
}
}(window.jQuery);



ミューテックスの要素は次のとおりです:

•ロックとロック解除
•待機キュー
•実行方法
上記ロックの用途:



コードをコピー

コードは次のとおりです:


//ロックの名前を定義します

var lock = 'scrollTop()';

//lock を使用します

$.indream.async.lock(lock, function () { varscrollTop = $(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 '");' 、フルタイム);
});



この実装の実装についての簡単な説明。

-スピンロックまたはセマフォ
JavaScript 自体にはロック機能がないため、すべてのロックは高レベルで実装されます。

JavaScript のシングルスレッド原則によれば、JS のスレッド リソースは非常に限られており、スピン ロックの使用は非常に不向きであるため、セマフォを使用することにしました。

スピン ロックの実装は大まかに次のようになります。もちろん、do while の方が便利です。

コードをコピー


コードは次のとおりです。

while(true) {

/ /何かをしてください ...

}

これは必然的にスレッド リソースを占有しますが、残念ながら、JS には実行用のスレッドが 1 つしかないため、これは非常に不適切です。もちろん、必要に応じて、setIntervalとclearIntervalの組み合わせを選択して実装することもでき、効果は良好です。

ここではセマフォ方式が使用されており、原理はシンプルでコードも短いです。作業の実行順序は大まかに次のとおりです:

• コード セグメント (コールバック アクション) を待機キューにプッシュします
• 現在のロックが保持されているかどうかを判断し、保持されている場合は解放を待ち、そうでない場合はロックを取得してコールバックを実行します
•ロックが保持されている場合、解放し、待機キュー内の次のコールバックをシフトアウトし、それにロックを渡し、

を実行します。

-自動リリースまたは手動リリース
もちろん、最も快適な方法は、ロックして、現在のプログラムの実行時に自動的にリリースすることですが、カスタマイズされたリリース シナリオが必要な状況がより多く存在するため、これは簡単ではありません。 。

ロックを使用するメソッドは非同期であるため、AJAX や jQuery アニメーションなど、他のさまざまな非同期コンテンツが通常表示されます。現時点では、自動リリースは要件を満たしていません。実際には、実際の「実行が完了する」のは内部の非同期コールバックが完了した後であるため、つまり、基本的に開発者のみが制御できるため、ここでは手動リリースが選択されています。

しかし、依然として欠陥があり、リリースが繰り返されています。

ローカル変数がアクセス レベルで分離されていない限り、すべてのロック オブジェクトがパブリックであることがわかります。または、すべての JS オブジェクトがパブリックであると言うべきです。ただし、ここでの「ロック」自体は公共のリソースであるため、対処する方法はありません。

ここで実行できる最適化は、setInterval や clearInterval のように、パブリック ロック名でロックし、プライベート ロック ID でロックを解除して、繰り返しリリースされないようにする必要があります。ただし、上記の古いコードには含まれていないため、すぐに使用されると推定されます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。