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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация по static обьекту, static synchronized 
V
    Опции темы
Andy_L20066
Дата 21.10.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброго времени суток, 
есть вопрос.. начну сразу с кода:

1.
Код

public class Test {

private static final Object someObject = new Object();

public void doSomething()
{
        synchronized (someObject) {
                System.out.println(someObject.toString());
        }
}

}


Почитал тут немного в нете и как я понимаю в этом случае: только один 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.
Код

public class Test {

private static final Object someObject = new Object();

public static void doSomething()
{
        synchronized (someObject) {
                System.out.println(someObject.toString());
        }
}

}

В этом варианте ничто не мешает двом тредам вызвать метод doSomething одновременно внезависимости от того какой инстанс класса Test они используют.... или я не прав? вот тут если кто может - подскажите что будет синхронизироватся?

3.
Код

public class Test {

private static final Object someObject = new Object();

public static void doSomething()
{
        synchronized (Test.class) {
                System.out.println(someObject.toString());
        }
}

}

В этом варианте как я понимаю у нас будет локатся клас 'Test.class', тоесть doSomething - не вызовется двома тредами одновременно никак.

Напишите кто что думает по этому поводу.

PM MAIL ICQ   Вверх
LSD
Дата 21.10.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



1. Нет в Java никаких static объектов! Есть только статические ссылки на объекты.

2. Первый и второй варианты не ничем не отличаются в плане многопоточного поведения. Только один поток сможет выполнить этот метод в один момент времени.

3. В третьем варианте синхронизация будет идти по объекту тика java.lang.Class (тот самый который возвращается testObject.getClass()). Разница с первыми двумя, только в том, что этот объект доступен извне и кто нибудь может в другом месте кода написать:
Код

synchronized (Test.class) {
    ....
}

и это заблокирует и 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.
PM MAIL WWW   Вверх
Andy_L20066
Дата 21.10.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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)


PM MAIL ICQ   Вверх
LSD
Дата 21.10.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



На самом деле смысл имеет только то, на каком объекте был вызвал synchronized, а уж был он получен из статик переменной, как инстанс синглетона (это как раз случай с Test.class) или еще как - совершенно неважно.
Код

public class Test {
    private static final Object lock = new Object();

    public static void foo() {
        synchronized (lock) {
            ...
        }
    }
}

Код

public class Test {
    private static final Object lock = new Object();

    public void foo() {
        synchronized (lock) {
            ...
        }
    }
}

Код

public class Test {
    private static Test instance = new Test();
    
    private final Object lock = new Object();
    
    
    private Test() {
    }

    public static Test getInstance() {
        return instance;
    }

    public void foo() {
        synchronized (lock) {
            ...
        }
    }
}

Код

public class Test {
    public void foo() {
        synchronized (Test.class) {
            ...
        }
    }
}

Во всех этих случаях метод foo() одновременно будет выполняться только одним потоком. Правда в последнем случае, может выйти так что вообще не один поток не сможет его вызвать т.к. кто-то в другом месте залочил объект. И последний случай эквивалентен:
Код

public class Test {
    public static synchronized void 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.
PM MAIL WWW   Вверх
Andy_L20066
Дата 21.10.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо за ответы... последнее высказивание о том что "кто-то в другом месте залочил обьект" означает что если у меня есть вот такое:
Код

public class Test {
    public void foo() {
        synchronized (Test.class) {
            ...
        }
    }
}


то в другом классе у меня может быть лок на том же классе:

Код

public class A {
    public void foo1() {
        synchronized (Test.class) {
            ...
        }
    }
}

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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Andy_L20066 @  21.10.2009,  20:33 Найти цитируемый пост)
последнее высказивание о том что "кто-то в другом месте залочил обьект" означает что если у меня есть вот такое:
...
то в другом классе у меня может быть лок на том же классе:

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

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

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


 




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


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

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