モニターで次のマルチスレッドコードを実行するたびに例外が発生します。
http://pastebin.com/jTGR98W9 http://pastebin.com/hKvuDX2d
条件信号を実行するたびに、排他的である必要があるという例外が発生しますが、同期されているため、排他的です。それとも私は何か間違ったことをしていますか?
ありがとう
モニターで次のマルチスレッドコードを実行するたびに例外が発生します。
http://pastebin.com/jTGR98W9 http://pastebin.com/hKvuDX2d
条件信号を実行するたびに、排他的である必要があるという例外が発生しますが、同期されているため、排他的です。それとも私は何か間違ったことをしていますか?
ありがとう
古い組み込みロックとそのシグナリングメカニズム(、、synchronized
およびwait
)notify
を新しいクラスLock
とCondition
クラスと混合していますが、これらには関係がありません。これは混乱の原因であるため、そのうちの1つ(できればLock
とCondition
)に固執します。
問題は、呼び出し時に条件に関連付けられているロックを保持していないことが原因である可能性がありますsignal()
。lock()
とへの呼び出しでメソッドを囲みますunlock():
public void canEat(String name) {
lock.lock();
try {
eaters.add(name);
if (eaters.size() > 0) {
canFeed.signal();
}
} finally {
lock.unlock();
}
}
他の方法についても同じことを行う必要がありsynchronized
ます。