3

私は、オブジェクトと、それらがオブジェクトごとに複数の待機セットを提供する方法について読んでいてCondition、どのオブジェクトまたはオブジェクト/スレッドのグループが特定のシグナルを受け取るかを区別していました。
なぜ常連はそれをしないのObjectですか?例えば

それ以外の:

final Condition notFull  = lock.newCondition();   
final Condition notEmpty = lock.newCondition();     

lock.lock();  
try {  
  while (count == items.length)  
     notFull.await();  
  items[putptr] = x;  
  if (++putptr == items.length) putptr = 0;  
      ++count;  
   notEmpty.signal();   

これを行います:

final Object notFull  = new Object();     
final Object notEmpty = new Object();       

lock.lock();  
try {  
  while (count == items.length)  
     notFull.wait();  
  items[putptr] = x;  
  if (++putptr == items.length) putptr = 0;  
      ++count;  
   notEmpty.notify();   

まだ複数の待機セットがあり、通知されたスレッドを区別していませんか?

4

3 に答える 3

3

あなたの例では、1つのロックに2つの条件を作成しました。これは、組み込みの同期では実行できないことです。2つの条件を取得するには、2つのオブジェクトを使用する必要がありました。

また、notFullとnotEmptyをロックしなかったため、2番目のコードが壊れていますが、wait/notifyを呼び出します。IllegalMonitorStateExceptionが発生します。しかし、両方をロックしようとすると、同時にそれを行うことはできません。これが違いです

于 2013-02-12T12:40:21.690 に答える
1

またはsynchronizeを呼び出すときは、最初にする必要があります。2 つの異なるセットが必要な場合は、同期する 2 つのオブジェクトが必要です。ネストされた同期により、デッドロックが発生します。waitnotify

于 2013-02-12T12:33:43.813 に答える
0

大丈夫じゃない。メソッドを使用するには、オブジェクトのモニターを所有する必要がありますnotFull.wait()。許可されていても を解放lockしないため、他のスレッドはアクセスできませんでした。

于 2013-02-12T12:34:28.500 に答える