固有ロック(this)よりもブロックを同期するためにプライベートロックオブジェクトを優先するのはいつですか? 両方の結果を引用してください。
プライベート ロック オブジェクト:-
Object lock =new Object();
synchronized(lock)
{ }
固有ロック(これ):-
synchronized(this)
{ }
固有ロック(this)よりもブロックを同期するためにプライベートロックオブジェクトを優先するのはいつですか? 両方の結果を引用してください。
プライベート ロック オブジェクト:-
Object lock =new Object();
synchronized(lock)
{ }
固有ロック(これ):-
synchronized(this)
{ }
各オブジェクトには固有のロックが 1 つだけあります。
synchronized キーワードを使用: 2 つの異なるスレッドから同じオブジェクトから 2 つの同期メソッドを呼び出した場合、1 つのスレッドがメソッド 1 を実行し、もう 1 つのスレッドがメソッド 2 を実行できたとしても、両方のメソッドが同じ組み込みロックを共有するため、それは起こりません。 (オブジェクトに属します)。そして、それによると、一方のスレッドが他方のメソッドを実行するために固有のロックを取得する前に、もう一方のスレッドが終了するのを待つ必要があります。
ただし、複数のロックを使用する場合は、一度に 1 つのスレッドのみがメソッド 1 にアクセスでき、一度に 1 つのスレッドのみがメソッド 2 にアクセスできるようにします。ただし、メソッド 1 とメソッド 2 にそれぞれ 1 つのスレッドが同時にアクセスできるようにし、操作に必要な時間を短縮します。
プライベート ロックは、ある種のロック シャーディングを行っている場合に役立ちます。つまり、オブジェクトの特定の部分のみをロックする必要があり、他の部分には別のクライアントからアクセスできます。
この概念を理解するための 1 つの簡単な類似点は、データベースのテーブル ロックです。1 つのテーブルを変更する場合、データベース全体ではなく、その 1 つのテーブルのロックを取得するため、他のクライアントが残りのテーブルを変更できます。同様のロジックを POJO で実装する必要がある場合は、必要な数のプライベート ロックを使用します。
このアプローチの欠点の 1 つは、クラスが多くのオブジェクトで散らかってしまうことです。これは、より単純なロック戦略を使用して、より細かいクラスのセットにリファクタリングする必要があることを示している可能性がありますが、それはすべて設計と実装に依存します。