下面我已经包含了Producer-Consumer程序(来自Java - 完整参考指南第9版),这可能是许多人的线程间通信的熟悉示例。
$('.modal-body').html('<b>Order Number</b>: '+order.order_id +
'<br>'+'<b>Order Date:</b>' + ' ' +order.created_date+ '<br>'+'<b>Table Number:</b>' + ' ' +order.uid + '<br>'+'<b>Status:</b> ' + ' ' +order.status+ '<br>'+'<b>Title:</b>' + ' ' +order.title + '<br>'+'<b>Quantity:</b>' + ' ' +order.quantity+ '<br>'+'<b>Personalization:</b>' + ' ' +order.personalization);
我想澄清一下为什么Producer永远不会在没有Consumer返回的情况下修改 n 两次。特别是在 get 中, notify(); 行在 return n; 之前。 (当然,该方法必须以返回线结束。)
但是,在 get 中,为什么操作系统不能在 notify()行之后和 return n
答案 0 :(得分:3)
但是为什么Producer线程到达this.n = n是不可想象的。在Consumer线程执行下一个返回n之前;说,单核心系统?
因为,两个方法都是synchronized
,并且一次只能有一个线程执行它们。
对于您的方案,如果CPU在调用notify()
之后和返回n
之前放弃了消费者线程;由于synchronized
关键字,生产者仍将等待获取锁定。在调用notify
之后,生产者已经可以运行,但在消费者仍然与消费者保持联系之前不会运行。
答案 1 :(得分:0)
当一个线程在一个synchronized方法中时,在同一个实例上尝试调用它(或任何其他同步方法)的所有其他线程都必须等待。 [参考:完整参考:Java ]
这里,如果Consumer线程在get()方法内部,那么Producer线程必须在调用put()方法之前等待,直到Consumer完成执行get()方法,因为两个方法都是同步并且呼吁同一个实例q 。