このアプローチを非同期コードとマルチスレッドコードの両方で何度か見ました。カウンタは、非同期動作またはスレッド動作を追跡するために使用されます。新しいアクションが開始されるたびに、カウンタが増分されます。それが完了すると、カウンターはデクリメントされます。
これが発生している間、別のプロセスは、カウンターがゼロの場合にのみ続行できます。ただし、元のプロセスは、デッドロックなしでロックを複数回再取得する場合があります。
これは、別のワークフローに移動する前に解決する必要があるユーザーアクションを処理する方法として特に役立ちます。
このロック方法に名前はありますか?
私はあなたがリエントラントロックについて話していると思います:
ReentrantLockは、共有リソースにアクセスしている間、メソッドの同期を提供します。
共有リソースを操作するコードは、lockメソッドとunlockメソッドの呼び出しに囲まれています。
これにより、現在作業中のスレッドにロックが与えられ、共有リソースをロックしようとする他のすべてのスレッドがブロックされます。 ReentrantLockを使用すると、スレッドがリソースを複数回ロックすることができます。スレッドが最初にロック状態になると、保持カウントは1に設定されます。
ロックを解除する前に、スレッドは再びロックに入ることができ、そのたびに保持カウントが1ずつ増加します。
ロック解除要求ごとに、ホールドカウントは1つデクリメントされ、ホールドカウントが0の場合、リソースはロック解除されます。
再入可能ロックは、公平性パラメータも提供します。これにより、ロックはロックリクエストの順序に従います。つまり、スレッドがリソースをロック解除した後、ロックは最も長い時間待機していたスレッドに行きます。この公平性モードは、ロックのコンストラクターにtrueを渡すことによって設定されます。これらのロックは次のように使用されます。
public void method() { reentrantlock.lock(); try { //Do some work } catch(Exception e) { e.printStackTrace(); } finally { reentrantlock.unlock(); } }
メソッド本体で例外がスローされた場合でもロックが確実に解放されるように、ロック解除ステートメントは常にfinallyブロックで呼び出されます。
セマフォ について話しているようです。