0

モニターで次のマルチスレッドコードを実行するたびに例外が発生します。

http://pastebin.com/jTGR98W9 http://pastebin.com/hKvuDX2d

条件信号を実行するたびに、排他的である必要があるという例外が発生しますが、同期されているため、排他的です。それとも私は何か間違ったことをしていますか?

ありがとう

4

1 に答える 1

2

古い組み込みロックとそのシグナリングメカニズム(、、synchronizedおよびwaitnotifyを新しいクラスLockConditionクラスと混合していますが、これらには関係がありません。これは混乱の原因であるため、そのうちの1つ(できればLockCondition)に固執します。

問題は、呼び出し時に条件に関連付けられているロックを保持していないことが原因である可能性がありますsignal()lock()とへの呼び出しでメソッドを囲みますunlock():

public void canEat(String name) {
   lock.lock();
   try {
       eaters.add(name);
       if (eaters.size() > 0) {
          canFeed.signal();
       }
   } finally {
       lock.unlock();
   }
}

他の方法についても同じことを行う必要がありsynchronizedます。

于 2011-03-10T13:04:30.703 に答える