生产者和消费者问题中锁定的问题?
public class ManufactureConsume {
public static void main(String[] args) {
CommodityStack cs = new CommodityStack();
Manufacture m = new Manufacture(cs);
Consumer c = new Consumer(cs);
//new Thread(m).start();
new Thread(m).start();
new Thread(m).start();
new Thread(c).start();
}
}
class Commodity {
public int id = 0;
Commodity (int id) {
this.id = id;
}
public String toString() {
return "Commodity:" + id;
}
}
class CommodityStack {
static int index = 0;
static Commodity[] c = new Commodity[6];
public synchronized void push (Commodity cd) {
while (index == c.length) {
try{
this.wait();
}catch (InterruptedException e) {}
}
this.notifyAll();
c[index] = cd;
index++;
}
public synchronized Commodity pop () {
while (index == 0) {
try{
this.wait();
}catch (InterruptedException e) {}
}
this.notifyAll();
index--;
return c[index];
}
}
class Manufacture implements Runnable {
CommodityStack cs = null;
Manufacture (CommodityStack cs) {
this.cs = cs;
}
public void run() {
for (int i = 0; i < 10; i++) {
Commodity cd = new Commodity(cs.index);
cs.push(cd);
System.out.println("制造" + cd);
try {
Thread.sleep(300);
} catch (InterruptedException e ) {}
}
}
}
class Consumer implements Runnable {
CommodityStack cs = null;
Consumer (CommodityStack cs) {
this.cs = cs;
}
public void run() {
while (cs.index != 0) {
System.out.println("吃掉了" + cs.pop());
try {
Thread.sleep(200);
} catch (InterruptedException e ) {}
}
}
}
问题是,在实际运行中,会出现同生产了两个同样ID的Commodity。也会出现同时消费了两个相同ID的Commodity的问题。
也就是说,会出现一下的输出:
“
制造Commodity:3
制造Commodity:3
制造Commodity:4
吃掉了Commodity:4
制造Commodity:4
吃掉了Commodity:4
吃掉了Commodity:3
吃掉了Commodity:3
”
这种情况是不是意味着生产和消费进程未能被独占锁定。有什么方法可以解决呢?
...全文
相关推荐
15个多线程问题集锦
此文,描述了多线程的几个最核心的使用问题以及注意事项。
并发编程面试专题.pdf
并发编程面试专题.pdf
生产者消费者代码(C++版)
用Posix信号量, Posix互斥量, 解决生产者消费者问题(c++版)
Python实现的生产者、消费者问题完整实例
主要介绍了Python实现的生产者、消费者问题,简单描述了生产者、消费者问题的概念、原理,并结合完整实例形式分析了Python实现生产者、消费者问题的相关操作技巧,需要的朋友可以参考下
12.2 Qt5多线程:使用QWaitCondition实现生产者和消费者
Qt5多线程,使用QWaitCondition类实现生产者和消费者问题。


Java SE
