タグ付けされた質問 「locking」

ロックにより、さまざまなタイプのリソースを一度に1つのプロセスだけが使用できるようになります。

9
揮発性vs.インターロックvs.ロック
クラスに、public int counter複数のスレッドによってアクセスされるフィールドがあるとしましょう。これintは、増分または減分されるだけです。 このフィールドをインクリメントするには、どのアプローチを使用する必要がありますか。その理由は何ですか。 lock(this.locker) this.counter++;、 Interlocked.Increment(ref this.counter);、 のアクセス修飾子をcounterに変更しますpublic volatile。 私が発見したvolatileので、私は多くのlockステートメントとの使用を削除してきましたInterlocked。しかし、これを行わない理由はありますか?

10
楽観的ロックと悲観的ロック
楽観的ロックと悲観的ロックの違いを理解しています。どちらを一般的に使用するかを誰かに説明してもらえますか? そして、この質問に対する答えは、クエリを実行するためにストアドプロシージャを使用しているかどうかによって異なりますか? しかし、チェックするだけで、楽観的とは「読み取り中にテーブルをロックしない」ことを意味し、悲観的とは「読み取り中にテーブルをロックする」ことを意味します。

8
ロックはどのように正確に機能しますか?
スレッドセーフではないオブジェクトを使用する場合、次のようなロックでコードをラップすることがわかります。 private static readonly Object obj = new Object(); lock (obj) { // thread unsafe code } したがって、複数のスレッドが同じコードにアクセスするとどうなりますか(ASP.NET Webアプリケーションで実行されていると仮定しましょう)。彼らはキューに入っていますか?もしそうなら、彼らはどれくらい待つでしょうか? ロックを使用することによるパフォーマンスへの影響は何ですか?

16
なぜlock(this){…}が悪いのですか?
MSDNのドキュメントには、と言っています public class SomeObject { public void SomeOperation() { lock(this) { //Access instance variables } } } 「インスタンスがパブリックにアクセスできる場合の問題」です。なぜだろう?ロックが必要以上に長く保持されるからでしょうか?それとももっと陰湿な理由がありますか?



7
Javaで偽のウェイクアップが実際に起こりますか?
さまざまなロック関連の質問を見て、(ほとんど)常に「偽のウェイクアップのためにループ」という用語を見つけています1おそらく、誰かがそのようなウェイクアップを経験しましたか(たとえば、適切なハードウェア/ソフトウェア環境を想定しています)? 「スプリアス」という言葉には明らかな理由がないことを知っていますが、そのようなイベントの理由は何ですか? (1注:ループの実行については問いません。) 編集:ヘルパーの質問(コードサンプルが好きな人向け): 次のプログラムを実行している場合: public class Spurious { public static void main(String[] args) { Lock lock = new ReentrantLock(); Condition cond = lock.newCondition(); lock.lock(); try { try { cond.await(); System.out.println("Spurious wakeup!"); } catch (InterruptedException ex) { System.out.println("Just a regular interrupt."); } } finally { lock.unlock(); } } } awaitランダムなイベントを永遠に待つことなく、これを偽って目覚めるにはどうすればよいですか

5
SELECTステートメントでのNOLOCKヒントの影響
本当の質問は次のとおりだと思います: ダーティリードを気にしない場合、SELECTステートメントにwith(NOLOCK)ヒントを追加すると、次のパフォーマンスに影響します。 現在のSELECTステートメント 指定されたテーブルに対する他のトランザクション 例: Select * from aTable with (NOLOCK)
199 sql  sql-server  locking 

11
オブジェクトまたはメソッドのJava同期メソッドロック?
同じクラスに2つの同期されたメソッドがあり、それぞれが異なる変数にアクセスしている場合、2つのスレッドがそれらの2つのメソッドに同時にアクセスできますか?ロックはオブジェクトで発生しますか、それとも同期メソッド内の変数と同じくらい具体的になりますか? 例: class X { private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } } 2つのスレッドが実行クラスXの同じインスタンスにアクセスすることができますx.addA()とx.addB()同じ時間に?

7
再帰的ロック(Mutex)と非再帰的ロック(Mutex)
POSIXでは、ミューテックスを再帰的にすることができます。つまり、同じスレッドが同じミューテックスを2回ロックしても、デッドロックは発生しません。もちろん、2回アンロックする必要もあります。そうしないと、他のスレッドがミューテックスを取得できません。pthreadをサポートするすべてのシステムが再帰的ミューテックスもサポートするわけではありませんが、POSIX準拠にしたい場合は、そうする必要があります。 他のAPI(より高レベルのAPI)も、通常はロックと呼ばれるミューテックスを提供します。一部のシステム/言語(Cocoa Objective-Cなど)では、再帰的mutexと非再帰的mutexの両方を提供しています。一部の言語では、どちらか一方しか提供されません。たとえば、Javaミューテックスは常に再帰的です(同じオブジェクトで同じスレッドが2回「同期」する場合があります)。それらが提供する他のスレッド機能によっては、再帰的ミューテックスは自分で簡単に記述できるため、再帰ミューテックスがなくても問題ない場合があります(私は、より単純なミューテックス/条件操作に基づいて、自分で再帰的ミューテックスをすでに実装しています)。 私が本当に理解していないこと:非再帰的mutexは何に適していますか?同じミューテックスを2回ロックする場合、なぜスレッドデッドロックが必要なのですか?それを回避できる高水準言語(たとえば、デッドロックが発生するかどうかをテストし、発生する場合は例外をスローする)でも、通常はそうしません。代わりにスレッドをデッドロックさせます。 これは、誤って2回ロックして1回だけロック解除した場合にのみ発生します。再帰的なmutexの場合、問題を見つけるのは難しくなります。そのため、すぐにデッドロックして、間違ったロックがどこにあるかを確認できますか?しかし、ロックを解除するときにロックカウンターを返すのと同じことはできませんでした。最後のロックを解放し、カウンターがゼロではない場合、例外をスローしたり、問題をログに記録したりできます。または、私が確認できない他のより有用な非再帰的ミューテックスのユースケースはありますか?それとも、非再帰的なミューテックスは再帰的なミューテックスよりもわずかに高速になる可能性があるため、それは単にパフォーマンスかもしれませんか?しかし、私はこれをテストしましたが、違いは実際にはそれほど大きくありません。


17
デッドロックとは何ですか?
マルチスレッドアプリケーションを作成するときに発生する最も一般的な問題の1つは、デッドロックです。 コミュニティへの私の質問は次のとおりです。 デッドロックとは何ですか? それらをどのように検出しますか? それらを処理しますか? そして最後に、どのようにしてそれらが発生するのを防ぎますか?

5
.NET Frameworkの同時HashSet <T>?
次のクラスがあります。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); } "Data"フィールドを別のスレッドから変更する必要があるので、現在のスレッドセーフな実装についていくつかの意見をお願いします。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); public void Add(string Val){ lock(Data) Data.Add(Val); } public void Remove(string Val){ lock(Data) Data.Remove(Val); } } 直接現場に行き、複数のスレッドによる同時アクセスから保護するためのより良い解決策はありますか?

5
ロックされていないミューテックスのロックはどの程度効率的ですか?ミューテックスのコストはいくらですか?
低レベル言語(C、C ++など):ミューテックスの束(pthreadが提供するものやネイティブシステムライブラリが提供するものなど)とオブジェクトの単一のミューテックスのどちらを使用するかを選択できます。 ミューテックスをロックすることはどのくらい効率的ですか?つまり、アセンブラー命令はいくつありますか。また、それらにかかる時間(ミューテックスがロック解除されている場合)はどれくらいかかりますか? mutexの費用はいくらですか?ミューテックスを本当にたくさん持つのは問題ですか?または、私がint変数を持っているのと同じくらい多くのミューテックス変数をコードにスローすることはできますか? (ハードウェアの違いはどれくらいかわかりません。ある場合は、それについても知りたいのですが、ほとんどの場合、共通のハードウェアに興味があります。) 重要なのは、オブジェクト全体に対して単一のミューテックスではなく、オブジェクトの一部のみをカバーする多くのミューテックスを使用することで、多くのブロックを安全にできることです。そして、これについてどこまで行けばいいのかと思っています。つまり、どれほど複雑で、これが何個のミューテックスを意味するかに関係なく、可能なブロックを可能な限り安全に保護する必要がありますか? ロックに関するWebKitsブログ投稿(2016)は、この質問に非常に関連しており、スピンロック、アダプティブロック、futexなどの違いについて説明しています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.