1
8
是的,这是预料中的僵局。当使用空队列调用consumer()时发生。在本例中,consumer()持有“this”的锁,并等待来自myQueue的对象。同时,任何producer()都不能锁定“this”(由使用者持有),因此不能将任何对象放入myQueue,这会阻止使用者获取对象。 要解决死锁,您可以只同步方法的一部分,或者使用简单队列并实现自己的等待数据。 部分同步示例:
在这种情况下,myQueue操作期间会释放对“this”的锁定。它将允许producer()按原样进行,并将对象放入队列。
在这个例子中,“this”的锁在调用this.wait()期间被释放(有关详细信息,请参见Object.wait()),它允许生产者将对象放入队列。同时,生产者唤醒一个等待数据的消费者。 请注意,在这两种情况下,producer方法都将在只执行consumer方法的“一半”时执行。一、 消费方法不再是原子的,而只是半原子的。如果您需要使用者的原子性,那么您应该考虑更好地规范生产者/使用者方法,因为所描述的死锁是“同步”中的逻辑缺陷。在执行“atomic”consumer()方法期间不能放置对象,同时consumer()要求对象在队列中。 |
2
1
正如马克斯卡指出的,
如果你坚持要保持同步
|
Administrator · c#-等待完成2个线程中的1个 7 年前 |
Magnar Myrtveit · 发送电子邮件的脚本中出现死锁 7 年前 |
BlackBrain · MySQL死锁,带有引发触发器的插入 8 年前 |
Patt · ExecutorService和ForkJoinPool 8 年前 |