我读到当向对象/另一个对象发送对象时,不是发送实际对象,而是发送副本。所以,当多线程时,我有一个大小为1的ArrayBlockingQueue,以及两个类--Producer和Consumer(它们是Thread的扩展),它们相应地读取和写入数据:
ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>();
Producer add = new Producer(queue);
Consumer show = new Consumer(queue);
我不是向构造函数发送“queue”变量本身,而是发送它的副本。所以,两个对象都有不同的队列,所以这两个对象之间不会有任何误解,对吧?如果是,为什么我们需要线程同步?如果不是,为什么?
答案 0 :(得分:1)
我读到当向对象/另一个对象发送对象时,不是发送实际对象,而是发送副本。
这是不正确的。 Java按值传递,但它按值传递引用。因此,队列引用的副本将传递给生产者和使用者。但是,不会复制引用的对象。
答案 1 :(得分:0)
不,add
和show
都会引用同一个对象,ArrayBlockingQueue
称为queue
。
如果你考虑一下,只传递副本就不会有太大的好处。如何在施工时间后传递实际信息?
由于大概add
和show
位于不同的线程中,因此需要同步机制。
答案 2 :(得分:0)
在您的示例中,您将相同的对象传递给add和show对象。你没有传递副本。因此,添加的任何操作可能对 show 产生影响,因此在这种情况下需要线程同步