Отправка объекта и синхронизация потоков - PullRequest
0 голосов
/ 25 апреля 2011

Я читал, что при отправке объекта в функцию / другой объект отправляется не сам объект, а его копия. Итак, при многопоточности у меня есть ArrayBlockingQueue размером один, и два класса - Producer и Consumer (которые являются расширениями Thread), которые соответственно читают и записывают данные следующим образом:

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

Я посылаю не конструкторам саму переменную "queue", а ее копию. Итак, оба объекта имеют разные очереди, поэтому между этими двумя объектами не возникнет недопонимания, верно? Если да, зачем нам нужна синхронизация потоков? Если нет, то почему?

Ответы [ 3 ]

1 голос
/ 25 апреля 2011

Я прочитал, что при отправке объекта функции / другому объекту отправляется не сам объект, а его копия.

Это неверно.Java передает по значению, но передает по значению.Таким образом, копия ссылки на очередь передается производителю и потребителю.Однако указанный объект не копируется.

0 голосов
/ 25 апреля 2011

В вашем примере вы передаете один и тот же объект 1002 * объектам add и show.Вы не передаете копию.Поэтому любые операции добавления могут влиять на show , поэтому в этом случае требуется синхронизация потоков

0 голосов
/ 25 апреля 2011

Нет, add и show оба будут иметь ссылку на один и тот же объект, ArrayBlockingQueue, известный как queue.

Если подумать, это не оченьочень хорошо, что только копии передаются.Как будет передаваться фактическая информация после создания?

Поскольку предположительно add и show находятся в разных потоках, вам необходим механизм синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...