![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
oson |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 289 Регистрация: 3.3.2004 Где: Севастополь Репутация: нет Всего: 1 |
Господа.
В Java все методы виртуальные. То есть в метод передаются не значения, а ссылка на объект. Если я делаю вот таким образом - внутри класса в private метод передаю например 3 объекта, для того чтобы там внутри этого приват метода изменить их состояние - типа такого :
Есть ли какие-то издержки и опасности у такого подхода? |
|||
|
||||
MaxPayneC |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 18.2.2006 Репутация: 5 Всего: 9 |
Простые типы передаются по значению, по ссылке только наследники Object. В многопоточной среде есть вероятность, что метод, изменяющий объекты, будет вызван одновременно два и более раз.
Это сообщение отредактировал(а) MaxPayneC - 24.1.2010, 16:12 |
|||
|
||||
oson |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 289 Регистрация: 3.3.2004 Где: Севастополь Репутация: нет Всего: 1 |
То есть если это например Web приложение то в такой метод могут одновременно передать свои параметры из двух разных объектов?
|
|||
|
||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
Ну это само по себе не страшно. Потом, они же не в одну и ту же процедуру будут передавать. Просто метод, изменяющий состояние объектов в потоках могут вызвать несколько раз одновременно. Тогда может случится, что два метода (два экземпляра одного метода) изменяют одни и те же объекты одновременно, от этого нужно защищаться. Или не нужно, смотря по задаче. |
|||
|
||||
danilka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 15.1.2010 Репутация: нет Всего: нет |
||||
|
||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
И что два потока потом делают с этими инстансами?
|
|||
|
||||
danilka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 15.1.2010 Репутация: нет Всего: нет |
||||
|
||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
Вот смотри. Объект A.
Есть B1->modifyA(A) и B2->modifyA(A) в двух потоках. Допустим, методы выполнились одновременно. Они оба получили копии инстансов объекта А. Что произойдет по окончании работы методов? |
|||
|
||||
danilka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 15.1.2010 Репутация: нет Всего: нет |
Не ну тут то понятно что проблемы. Но я никак не могу понять почему объект А общий. В исходном примере каждый поток, который выполняет метод modify предварительно создает все объекты, являющиеся параметрами данного метода в методе откуда вызывается modify. Соответственно у каждого потока есть свой набор объектов которые он и модифицирует. Либо я прав либо пятница вечер ![]() |
|||
|
||||
oson |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 289 Регистрация: 3.3.2004 Где: Севастополь Репутация: нет Всего: 1 |
Давайте проясним ситуацию. b1->modifyA(a) и b2->modifyA(a) в двух потоках - есть проинициализированный обьект b1 класса B, у которого есть метод modifyA(A). И есть проинициализированный обьект b2 класса B, у которого есть метод modifyA(A). Теперь b1 вызывает свой метод b1.modifyA(a), и b2 вызывает свой метод b2.modifyA(a). то есть имеется ввиду, что из разных инстанцов класса B (b1 и b2) вызовут метод, меняющий один и тот же объект a? (какой-нить a@123)? Так что ли? А как они могут получить одновременно доступ к a? Или тут чтото с потоками связано. Можете разъяснить плиз. |
|||
|
||||
EnJ |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 4.1.2010 Где: Харьков Репутация: нет Всего: нет |
Когда два потока р1 и р2 входят(пусть даже одновременно) в метод calculate(), они для себя копируют созданные объекты и с ними работают. Поскольку объекты являются локальными, при изменени состояний объектов потоком р1, состояния объектов, с которыми работет поток р2, изменяться не будут.
Чтобы понять, что к чему, почему так, загляни сюда: http://base.vingrad.ru/view/98-Mnogopotoch...rogrammirovanie Другой вопрос, если потоки оперируют с одними и теми же объектами, тогда результаты могут быть непредсказуемы. Я, правда, не знаю, может ли такое быть в этой программе. |
|||
|
||||
danilka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 15.1.2010 Репутация: нет Всего: нет |
Вот и я не понимаю как в этом коде может случиться чтобы 2 потока оперировали с одними и теми же объектами... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |