0

プライベート ロック オブジェクトを使用してブロックを同期するのはいつですか?

Object lock =new Object();  
synchronized(lock)
{  }

クライアント側のロックを使用してブロックを同期するのはいつですか?

private final List<InetAddress> ips =
Collections.synchronizedList(new ArrayList< InetAddress >());  
synchronized(ips)
{  }

クライアント側のロックが優先されないのはなぜですか?

4

1 に答える 1

1

オブジェクトは、クラスのメソッド内の同期ブロックでロックする目的で明示的に使用する必要があります。この固有のロックは、クラスではなくプライベート オブジェクトのインスタンスに関連付けられています。したがって、このクラスのメソッドと敵対的なクラスのメソッドとの間でロックの競合が発生することはありません (オブジェクト ロックを非公開および最終として宣言することをお勧めします)。

クライアント側のロックでは、クラスは、他のクラスからアクセスできる可能性のあるオブジェクトのロックを保持します。クライアント側のロックでは、オブジェクト X を使用するクライアント コードを、X が自身の状態を保護するために使用するロックで保護する必要があります。クライアント側のロックを使用するには、X が使用するロックを知っている必要があります。クライアント側のロックは、クラスのロック コードをその特定のクラスとはまったく関係のないクラスに配置する必要があるため、さらに脆弱です。

たとえば、クラス A にメソッド同期を使用するメソッドがあるとします。別のクラス B にはクラス A への参照があり、クラス A のオブジェクトをロックとして使用してメソッド内のブロックを同期します。いつの日か、クラス A のロック戦略が変更されてプライベート最終ロック オブジェクトを使用するようになった場合、クラス A のメソッドを呼び出すスレッドは新しいロック戦略に従うのに対し、クラス B のメソッドは依然としてオブジェクトを使用するため、クラス B のロック戦略は破綻します。クラス A としてロック。したがって、実装では 2 つの異なるロックが使用されます。

于 2013-11-08T08:59:48.127 に答える