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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Synchronized методы 
V
    Опции темы
EgorTheBlade
Дата 21.8.2011, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый День.

Есть класс 

Код

Class A{
synchronized do1(){
}
synchronized do2(){
}
};



Метод do1() выполняет поток Thread 1.
Метод do2() выполняет поток Thread 2.

Thread 2 не сможет выполнить метод do2 () пока работает  do1().

Почему это происходит?

Причина - это методы одного класса?

Спасибо.

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


Опытный
**


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

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



Приводи код исследования - заставлять догадываться не очень хорошая идея. 
PM MAIL   Вверх
ARMALITE
Дата 21.8.2011, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Почему Thread 2 не может выполнить do2? Он, судя по вашим словам, его уже выполняет. Вот do1 он выполнить не сможет, да, потому что synchronized-методы выполняет всегда одновременно только один поток.
PM MAIL ICQ Skype   Вверх
tux
Дата 21.8.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(EgorTheBlade @  21.8.2011,  11:34 Найти цитируемый пост)
Причина - это методы одного класса?

Причина в том что в том случае когда метод объявлен synchronized, монитором выступает экземпляр класса. То есть получается что первый поток выполняя do1() захватывает объект-монитор (экземпляр класса A) и до тех пор пока он не будет освобожден второй поток выполнить do2() не сможет. Если создать второй экземпляр A, то do1() и do2() смогут выполняться параллельно. Если do1() и do2() определить как static, то монитором будет уже объект класса и методы не смогут быть выполнены параллельно независимо от количества экземпляров класса A.

Это сообщение отредактировал(а) tux - 21.8.2011, 16:36
PM MAIL Skype GTalk Jabber YIM   Вверх
EgorTheBlade
Дата 21.8.2011, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

Class MyThread1 : implements Runnable{

run (){
A obj = new A();
obj.do1();
}
}

Class MyThread2 : implements Runnable{

run (){
A obj = new A();
obj.do2();
}
}

public static void  main(){
new Thread(new MyThread1()).start() //  do1();
new Thread(new MyThread2()).start() //  do2();
}


Сможет ли начатся do2(), если do1() еще незавершен?

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

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

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


 




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


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

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