发送对象和线程同步

时间:2011-04-25 08:41:09

标签: java synchronization thread-safety

我读到当向对象/另一个对象发送对象时,不是发送实际对象,而是发送副本。所以,当多线程时,我有一个大小为1的ArrayBlockingQueue,以及两个类--Producer和Consumer(它们是Thread的扩展),它们相应地读取和写入数据:

ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>();
Producer add = new Producer(queue);
Consumer show = new Consumer(queue);

我不是向构造函数发送“queue”变量本身,而是发送它的副本。所以,两个对象都有不同的队列,所以这两个对象之间不会有任何误解,对吧?如果是,为什么我们需要线程同步?如果不是,为什么?

3 个答案:

答案 0 :(得分:1)

  

我读到当向对象/另一个对象发送对象时,不是发送实际对象,而是发送副本。

这是不正确的。 Java按值传递,但它按值传递引用。因此,队列引用的副本将传递给生产者和使用者。但是,不会复制引用的对象。

答案 1 :(得分:0)

不,addshow都会引用同一个对象,ArrayBlockingQueue称为queue

如果你考虑一下,只传递副本就不会有太大的好处。如何在施工时间后传递实际信息?

由于大概addshow位于不同的线程中,因此需要同步机制。

答案 2 :(得分:0)

在您的示例中,您将相同的对象传递给add和show对象。你没有传递副本。因此,添加的任何操作可能 show 产生影响,因此在这种情况下需要线程同步