![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Andy_L20066 |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 10.3.2008 Репутация: нет Всего: 1 |
Доброго времени суток,
есть вопрос.. начну сразу с кода: 1.
Почитал тут немного в нете и как я понимаю в этом случае: только один Thread который использует любой инстанс класса Test может вызвать метод doSomething(), и если someObject не был бы статиком, тогда Threads c разными инстансами класса Test могли бы вызвать doSomething, тоесть по сути синхронизация здесь будет иметь место для однотипных инстансов класса Test (instance-dependent) (дословно это звучит так: By using a static object as your monitor object, only one thread using ANY instance of the Test class can get into the sync block. If the monitor object was not a static object, other threads holding different instances of the Test class could get into the sync block) 2.
В этом варианте ничто не мешает двом тредам вызвать метод doSomething одновременно внезависимости от того какой инстанс класса Test они используют.... или я не прав? вот тут если кто может - подскажите что будет синхронизироватся? 3.
В этом варианте как я понимаю у нас будет локатся клас 'Test.class', тоесть doSomething - не вызовется двома тредами одновременно никак. Напишите кто что думает по этому поводу. |
||||||
|
|||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
1. Нет в Java никаких static объектов! Есть только статические ссылки на объекты.
2. Первый и второй варианты не ничем не отличаются в плане многопоточного поведения. Только один поток сможет выполнить этот метод в один момент времени. 3. В третьем варианте синхронизация будет идти по объекту тика java.lang.Class (тот самый который возвращается testObject.getClass()). Разница с первыми двумя, только в том, что этот объект доступен извне и кто нибудь может в другом месте кода написать:
и это заблокирует и doSomething() метод тоже. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Andy_L20066 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 10.3.2008 Репутация: нет Всего: 1 |
на счет статик обьектов согласен... (я просто перевел то что было на англ. написано здесь http://stackoverflow.com/questions/314607/...ization-blocks)
Тогда вопрос: если в многопоточном плане 1 и 2 не отличаются - то насчет того что написано о инстансах класса Test - это правда? Можешь обьяснить поподробнее? (By using a static object as your monitor object, only one thread using ANY instance of the Test class can get into the sync block. If the monitor object was not a static object, other threads holding different instances of the Test class could get into the sync block) |
|||
|
||||
| LSD |
|
||||||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
На самом деле смысл имеет только то, на каком объекте был вызвал synchronized, а уж был он получен из статик переменной, как инстанс синглетона (это как раз случай с Test.class) или еще как - совершенно неважно.
Во всех этих случаях метод foo() одновременно будет выполняться только одним потоком. Правда в последнем случае, может выйти так что вообще не один поток не сможет его вызвать т.к. кто-то в другом месте залочил объект. И последний случай эквивалентен:
(ну за исключением того, что один метод статический, другой нет). -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||||||
|
|||||||||||
| Andy_L20066 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 10.3.2008 Репутация: нет Всего: 1 |
Спасибо за ответы... последнее высказивание о том что "кто-то в другом месте залочил обьект" означает что если у меня есть вот такое:
то в другом классе у меня может быть лок на том же классе:
|
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Да. И методы foo() и foo1() одновременно будут выполняться только одним потоком. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]()
|
| Правила форума "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. |