Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача параметров в метод 
:(
    Опции темы
oson
Дата 24.1.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Господа.
В Java все методы виртуальные. То есть в метод передаются не значения, а ссылка на объект.
Если я делаю вот таким образом - внутри класса в private метод передаю например 3 объекта, для того чтобы там внутри этого приват метода изменить их состояние - типа такого :
Код



  public class MyClass
  {
     public Float calculate()
    {
        MyClass1 myClass1 = new MyClass1();
        MyClass2 myClass2 = new MyClass2();
        MyClass3 myClass3 = new MyClass3();
        
        changeStateOfMyClasses(myClass1,myClass2,myClass3);
        
         return myClass1.getCount() + myClass2.getCount() + myClass3.getCount(); 
    }
    
   private void changeStateOfMyClasses(MyClass1 myClass1,MyClass2 myClass2,MyClass3 myClass3)
   {
       myClass1.chageState();
       myClass2.chageState();
       myClass3.chageState();
   }
  }


Есть ли какие-то издержки и опасности у такого подхода?
PM MAIL   Вверх
MaxPayneC
Дата 24.1.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 5
Всего: 9



Простые типы передаются по значению, по ссылке только наследники Object. В многопоточной среде есть вероятность, что метод, изменяющий объекты, будет вызван одновременно два и более раз.

Это сообщение отредактировал(а) MaxPayneC - 24.1.2010, 16:12
PM   Вверх
oson
Дата 24.1.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



То есть если это например Web приложение то в такой метод могут одновременно передать свои параметры из двух разных объектов?
PM MAIL   Вверх
comcon1
Дата 24.1.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



Цитата(oson @  24.1.2010,  17:36 Найти цитируемый пост)
метод могут одновременно передать свои параметры из двух разных объектов

Ну это само по себе не страшно. Потом, они же не в одну и ту же процедуру будут передавать. Просто метод, изменяющий состояние объектов в потоках могут вызвать несколько раз одновременно. Тогда может случится, что два метода (два экземпляра одного метода) изменяют одни и те же объекты одновременно, от этого нужно защищаться. Или не нужно, смотря по задаче.


--------------------
PM MAIL   Вверх
danilka
Дата 28.1.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.1.2010

Репутация: нет
Всего: нет



Цитата(comcon1 @  24.1.2010,  18:21 Найти цитируемый пост)
Тогда может случится, что два метода (два экземпляра одного метода) изменяют одни и те же объекты одновременно


Как так может случиться если каждый поток перед тем как вызвать метод изменяющий состояния создает свои инстансы этих объектов?

PM MAIL   Вверх
comcon1
Дата 28.1.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



И что два потока потом делают с этими инстансами?


--------------------
PM MAIL   Вверх
danilka
Дата 28.1.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.1.2010

Репутация: нет
Всего: нет



Цитата(comcon1 @  28.1.2010,  15:13 Найти цитируемый пост)
И что два потока потом делают с этими инстансами? 


Они передают копии ссылок на эти инстансы в общий метод.
Но ведь 2 копии (одного метода) работают с разными наборами инстансов...

PM MAIL   Вверх
comcon1
Дата 29.1.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



Вот смотри. Объект A.
Есть B1->modifyA(A) и B2->modifyA(A) в двух потоках. 
Допустим, методы выполнились одновременно. Они оба получили копии инстансов объекта А. Что произойдет по окончании работы методов?


--------------------
PM MAIL   Вверх
danilka
Дата 29.1.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.1.2010

Репутация: нет
Всего: нет



Цитата(comcon1 @  29.1.2010,  13:10 Найти цитируемый пост)
Вот смотри. Объект A.
Есть B1->modifyA(A) и B2->modifyA(A) в двух потоках. 
Допустим, методы выполнились одновременно. Они оба получили копии инстансов объекта А. Что произойдет по окончании работы методов? 


Не ну тут то понятно что проблемы. Но я никак не могу понять почему объект А общий. В исходном примере каждый поток, который выполняет метод modify предварительно создает все объекты, являющиеся параметрами данного метода в методе откуда вызывается modify. Соответственно у каждого потока есть свой набор объектов которые он и модифицирует.

Либо я прав либо пятница вечер smile
PM MAIL   Вверх
oson
Дата 31.1.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Цитата(comcon1 @ 29.1.2010,  13:10)
Вот смотри. Объект A.
Есть B1->modifyA(A) и B2->modifyA(A) в двух потоках. 
Допустим, методы выполнились одновременно. Они оба получили копии инстансов объекта А. Что произойдет по окончании работы методов?

Давайте проясним ситуацию.
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? Или тут чтото с потоками связано.
Можете разъяснить плиз.
PM MAIL   Вверх
EnJ
Дата 31.1.2010, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.1.2010
Где: Харьков

Репутация: нет
Всего: нет



Когда два потока р1 и р2 входят(пусть даже одновременно) в метод calculate(), они для себя копируют созданные объекты и с ними работают. Поскольку объекты являются локальными, при изменени состояний объектов потоком р1, состояния объектов, с которыми работет поток р2, изменяться не будут.
Чтобы понять, что к чему, почему так, загляни сюда: http://base.vingrad.ru/view/98-Mnogopotoch...rogrammirovanie 

Другой вопрос, если потоки оперируют с одними и теми же объектами, тогда результаты могут быть непредсказуемы. Я, правда, не знаю, может ли такое быть в этой программе.
PM MAIL ICQ   Вверх
danilka
Дата 1.2.2010, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.1.2010

Репутация: нет
Всего: нет



Цитата(EnJ @  31.1.2010,  22:18 Найти цитируемый пост)
Другой вопрос, если потоки оперируют с одними и теми же объектами, тогда результаты могут быть непредсказуемы. Я, правда, не знаю, может ли такое быть в этой программе. 


Вот и я не понимаю как в этом коде может случиться чтобы 2 потока оперировали с одними и теми же объектами...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1004 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.