問題タブ [reentrantlock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - java.concurrent.ReentrantLock - 同じロックを複数回取得する理由
ReentrantLock を使用すると、同じスレッドが同じロックを複数回取得できるようになります。内部的には、ロック取得回数をカウントするカウンタを持っています。同じロックを 2 回取得した場合は、2 回解放する必要があります。しかし、私の質問は、なぜ誰かがロックを複数回取得したいのですか?1回の取得で十分でしょうか? 誰かが私に一般的なユースケースを教えてもらえますか?
objective-c - GCDを介してobjective-cに再入可能なロックメカニズムを実装する方法は?
私は、GCDキューを使用して、リソースへの同時アクセスが連続して行われるようにするいくつかのメソッドを備えたobjective-cクラスを持っています(これを行う標準的な方法)。
これらのメソッドの一部は、同じクラスの他のメソッドを呼び出す必要があります。したがって、ロック機構は再入可能である必要があります。これを行う標準的な方法はありますか?
最初は、これらのメソッドのそれぞれを使用してもらいました
アクセスを同期します。ご存知のように、これらのメソッドの 1 つが別のそのようなメソッドを呼び出すと、dispatch_sync 呼び出しが他のブロックが実行されるまで現在の実行を停止するため、デッドロックが発生します。これは、キューでの実行が停止されるため実行できません。これを解決するために、たとえば次の方法を使用しました。
そして、私の方法のそれぞれで、私は使用します
戻り値の型が異なるすべてのブロックに対して、別のメソッドを記述する必要があるため、このソリューションは好きではありません。さらに、この問題は私にとって非常に一般的なようであり、これに対するより優れた標準的な解決策が存在するはずです。
java - java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:127) で IllegalMonitorStateException を回避する方法
同時に 1 つのポリシーを変更するスレッドは 1 つだけにしたいのですが、異なるポリシーを同時に変更できます。次のようなコード:
上記のコードをメイン関数で実行すると
動作しますが、これを Web アプリケーションで使用すると、関数 throw IllegalMonitorStateException
.
誰かが私を助けることができますか?
ありがとう。
java - ReentrantLock - unlock() メソッドがリストで機能しないようです
リストを 2 つの方法で変更する必要があるプログラムを作成しています。この実装は完全に機能しますが、2 番目のスレッドがロックを取得できません。
多分誰かがそれがなぜなのか知っていますか?
java - ロックされる可能性がある公正な ReentrantLock の取得を優先する
私は、一連の操作がロックしている ReentrantLock を持っていnew ReentrantLock(true)
ます。スレッドがロックに「割り込み」、解放された後、他のスレッドの前にそれを取得する方法はありますか?
timed と untimed のさまざまな組み合わせを検討しましたtryLock
。
tryLock()
すでにロックが解除されていて、スレッドが待機している場合、ロックに割り込みますが、ロックが使用可能になるまで待機しません。- タイムアウトと同じ方法が公平です。
- 最初にロックされている場合、タイムアウトベースの tryLock は公平なスケジューリングにフォールバックするため、両方を組み合わせても機能しません。
それとも私が間違っていますか?
java - ConcurrentHashMap の書き込み順序の FIFO
私のCHMにはすでに次のデータが含まれています - >
1 りんご
2 バナナ
3 猫
4 犬
1,2,3,4 がキーで、Apple、バナナ... が対応するキーです。
3 つのスレッド t1、t2、t3 が同じ既存のレコードを変更したい場合 [3 Cat] 。この書き込みは FIFO 順で必要です。[その後、いくつかの操作が実行されます。Ex 値の変化パターンを記録するログ] 既存のソース コードを確認したところ、FIFO 書き込みが保証されていません。ソース コード ロックはセグメントに対して実行されます。以下はCHMクラスのソースコードです
セグメント クラスは、公平なロック メカニズムを提供しない ReentrantLock の Default コンストラクターを呼び出します。
新しい CHM クラスを作成し、次の変更を加えた場合
super(true) は、次の ReEntrantLock のコンストラクターを呼び出します
これにより、サグメント ロック操作が公平になり、書き込み操作が FIFO 順で実行されるようになると思います。あなたの見解を提案してください。
java - スレッドが共有する ReentrantLock がロックを尊重していないように見える
スレッド間で共有する単一の ReentrantLock オブジェクトがありますが、同じオブジェクトを異なるスレッドでロックできます。それらは異なるスレッドであるため、これは正しくないようです。切り捨てられた/単純化された出力は次のとおりです。
私のロギングは次のように構成されています。
ご覧のように:
- [http-bio-8080-exec-9] ロック (ホールド カウントは 0 であり、予想どおりロック後に 1 になります)
- [キャメル スレッド #1] ロック ( [http-bio-8080-exec-9] がまだロック解除されていないため、この可能性があるのはなぜですか? )
MyProcessor は、メッセージがキューに到着した結果として呼び出されます。lock
オブジェクトはコンストラクターで MyProcessor に渡されます。上記のログでロック オブジェクトを出力すると、同じオブジェクト (同じ参照 ID を持つ) であることがわかります。
何か案は?
ありがとう!