Java 生产者与消费者之间的僵局
程序仅在此处卡住(不要终止)Java 生产者与消费者之间的僵局,java,consumer,producer,Java,Consumer,Producer,程序仅在此处卡住(不要终止) 有人请解释一下我在这里做错了什么?将值声明为volatile 即静态易失性布尔值=false 您已经声明了set/get方法synchronized。这意味着它们锁定在此(对象的固有锁定)。 但是在您的代码中,您为每个线程实例化了不同的线程资源,从而不使它们同步,因为这种对于每种情况都是不同的。 按如下方式更改代码: value of a :1 getA()1 与MyThreadB相同 然后在ThreadExecutionPoint public
有人请解释一下我在这里做错了什么?将
值声明为volatile
即静态易失性布尔值=false代码>
您已经声明了set/get
方法synchronized
。这意味着它们锁定在此
(对象的固有锁定)。
但是在您的代码中,您为每个线程实例化了不同的线程资源
,从而不使它们同步
,因为这种
对于每种情况都是不同的。
按如下方式更改代码:
value of a :1
getA()1
与MyThreadB相同
然后在ThreadExecutionPoint
public class MyThreadA implements Runnable {
ThreadResource tR;
public MyThreadA(ThreadResource tr) {
this.tR = tr;
}
// your run method here NOT declaring a ThreadResource anymore!!!
}
我可以说,这不是理解生产者/消费者问题的最佳方式。@AliAlamiri:好的。这个例子有什么问题。你能不能提出一些其他建议。这可能有助于理解你的观点。谢谢!!:)。我创建了两个对象,并为每个对象创建了两个线程。所以基本上,多线程的全部目的都失去了。wait()方法正在等待一个没有被任何其他线程共享的对象。@AkshuJain:您没有在同一个锁上进行同步
。这是您的核心问题。同步
是对此
的锁定,在您的情况下,您使用了不同的此
对象来锁定
public class MyThreadA implements Runnable {
ThreadResource tR;
public MyThreadA(ThreadResource tr) {
this.tR = tr;
}
// your run method here NOT declaring a ThreadResource anymore!!!
}
ThreadResource tr = new ThreadResource();
Thread th1 = new Thread(new MyThreadA(tr));
Thread th2 = new Thread(new MyThreadB(tr));