Java 没有同步程序的生产者消费者出错
我在下面的代码中得到一个错误。有人能帮我吗Java 没有同步程序的生产者消费者出错,java,Java,我在下面的代码中得到一个错误。有人能帮我吗 class Q { int n; synchronized int get() { System.out.println("Got n :"+n); return n; } synchronized void put(int n) { this.n = n;
class Q
{
int n;
synchronized int get()
{
System.out.println("Got n :"+n);
return n;
}
synchronized void put(int n)
{
this.n = n;
System.out.println("Put n :"+n);
}
}
class Producer implements Runnable
{
Q q1;
Producer(Q q)
{
this.q1 = q;
new Thread(this).start();
}
public void run()
{
int i =0;
q1.put(i++);
}
}
class Consumer implements Runnable
{
Q q1;
Consumer(Q q)
{
this.q1 = q;
new Thread(this).start();
}
public void run()
{
q1.get();
}
}
class ProducerConsumerWithoutSync
{
public static void main(String args[])
{
Q q = new Q();
new Producer(q);
new Consumer(q);
}
}
不知道你到底出了什么问题。我把你的代码移植到了ideone 正如你所看到的,它工作得非常好。如果你认为这个值应该是1,那么你错了
你正在做
q1.put(i++)代码>此代码返回i,然后向其中添加一个。如果要在向其添加1后返回值,应使用++i
关于Q
的设计
同步是在Q
中完成的,带有一个假设put
将在get
之前调用。但代码中唯一能保证的是<代码>运行
生产者的方法将首先运行
想象一下,Producer中的计算很繁重(调用put
之前应该做的事情),更有可能首先调用get
我认为可能性很小,但在目前的情况下,仍然有可能发生
这是制作人的运行
(假设您修复了Kevin提到的++i
)>javap-c制作人
public void run();
Code:
0: iconst_0
1: istore_1
2: aload_0
3: getfield #15 // Field q1:LQ;
6: iinc 1, 1
9: iload_1
10: invokevirtual #31 // Method Q.put:(I)V
13: return
}
这是消费者的run
方法
public void run();
Code:
0: aload_0
1: getfield #15 // Field q1:LQ;
4: invokevirtual #31 // Method Q.get:()I
7: pop
8: return
如您所见,在调用Q.get/set之前,需要做一些事情
您可以在get中使用
wait
,在put
中使用notifyAll
来修复它。错误消息是什么?不要告诉其他程序员您遇到了错误,而不说错误是什么!ProducerConsumerWithoutSync.java:7:缺少返回语句}^1错误