同期に使用されるロッキングオブジェクトは任意ですか、それとも特定のオブジェクトを選択する理由がありますか?
5 に答える
なぜオブジェクトをロックするのですか?さまざまなスレッド間で共有されているためです。これですべてです。ロックするオブジェクトを選択するのとは対照的に、ロックとスレッドをどのように実装するかはおそらく難しい部分です。
複雑さと落とし穴の多くが取り除かれた/滑らかにされた、より現代的なロック技術の1つを使用する方がよいでしょう。パッケージ java.util.concurrent.locks
は良いスタートになるでしょう。
あなたの質問はかなり不明確です。
セマフォオブジェクトをロックと呼んでいる可能性があります。同期されたオブジェクトを参照している場合もあります。
1)セマフォは任意のオブジェクトでもかまいません。意図された目的は、他のスレッドがセマフォを解放するまで、セマフォでスレッドを保持するために使用できることです。
2)同期されたオブジェクトは、すべての機能をアトミックにします。スレッドがオブジェクトを操作している場合、他のオブジェクトはそれ自体の機能を完了するのを待ちます。これは通常、内部でセマフォを使用して実装されます。
セマフォは、同期の問題を解決するために使用されるオブジェクトです。
ロックオブジェクトは、排他的な部分を表す必要があります。
オブジェクト全体をロックする場合、つまりスレッドによって排他的に使用する場合は、オブジェクト「this」を使用してロックできます。これは、メソッドの「同期」作業が機能する方法です。
public class A
{
public synchronized void do1 ()
{
...
}
public synchronized void do2 ()
{
...
}
}
オブジェクトに排他的に使用する必要のあるメンバーのセットがある場合は、個別の(明示的な)ロックオブジェクトが必要です
public class B
{
private X x;
private Y y;
private Object lockXY = new Object ();
private R r;
private S s;
private Object lockRS = new Object ();
public void do1 ()
{
synchronize (lockXY) {
}
...
}
public void do2 ()
{
synchronize (lockRS) {
}
}
}
ロックを複雑にすることに注意してください。デッドロックに遭遇する可能性があります。
受け入れられた答えのように、選択するオブジェクトは任意です。正しく使用するようにしてください。ただし、一部のオブジェクトは他のオブジェクトよりも優れています。ロックのコンテキスト外でアクセスできる可能性のあるオブジェクトを使用しないことをお勧めします。他のコードの場合は、同期するか、notifyを呼び出すかなどを決定する可能性があります。したがって、代わりにjava.util.concurrentを使用するか、プライベートオブジェクトを使用することをお勧めします。