Java 发送对象和线程同步

Java 发送对象和线程同步,java,synchronization,thread-safety,Java,Synchronization,Thread Safety,我了解到,当向函数/另一个对象发送对象时,发送的不是实际对象,而是他的副本。因此,在进行多线程处理时,我有一个大小为1的ArrayBlockingQueue,以及两个类——生产者和消费者(它们是线程的扩展),它们相应地通过以下方式读取和写入数据: ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(); Producer add = new Producer(queue); Consume

我了解到,当向函数/另一个对象发送对象时,发送的不是实际对象,而是他的副本。因此,在进行多线程处理时,我有一个大小为1的ArrayBlockingQueue,以及两个类——生产者和消费者(它们是线程的扩展),它们相应地通过以下方式读取和写入数据:

ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>();
Producer add = new Producer(queue);
Consumer show = new Consumer(queue);
ArrayBlockingQueue队列=新建ArrayBlockingQueue();
生产者添加=新生产者(队列);
消费者展示=新消费者(队列);

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

否,
add
show
都会引用同一个对象,
ArrayBlockingQueue
称为
queue

如果你想一想,只传递副本是没有多大好处的。在施工时间过后,实际信息如何传递

由于
add
show
可能在不同的线程中,因此您需要一个同步机制

我了解到,当向函数/另一个对象发送对象时,发送的不是实际对象,而是他的副本


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

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

so的可能副本,您想说它实际上复制了内存中的某个变量,该变量包含表示对象引用的数字吗?@Nika:是的,对象就是这样。像int这样的基本类型只是复制的。