执行条件等待时出现异常?

发布于 2024-10-21 03:05:58 字数 237 浏览 5 评论 0原文

每次使用监视器运行以下多线程代码时,我都会收到异常。

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

每次我执行条件信号时,都会收到一个异常,该异常表示它应该是独占的,但是考虑到它是同步的,它是独占的。或者我做错了什么?

谢谢

I am getting an Exception everytime I run the following multithreaded code with Monitors.

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

Everytime I perform a condition signal, I get an exception, which says that it should be exclusive, it is however exclusive, given that it is synchronized. Or am I doing something wrong?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吃不饱 2024-10-28 03:05:58

您将旧的固有锁及其信号机制(synchronizedwaitnotify)与新的 Lock 混合在一起和 Condition 类,尽管它们没有任何关系。这是造成混乱的一个原因,因此我会坚持使用其中之一(最好是 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 方法也需要执行相同的操作。

You are mixing the old intrinsic locks and their signaling mechanism (synchronized, wait and notify) with the new Lock and Condition classes, though they don't have any relationship. This is a source for confusion, so I'd stick to one of them (preferably Lock and Condition).

Your problem is probably caused by not holding the lock that is associated to the condition when you are calling signal(). Surround the methods with calls to lock() and unlock():

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

The same needs to be done for the other synchronized methods.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文