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错误