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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> synchronized 
:(
    Опции темы
Elene
Дата 8.12.2004, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пожалуйста, объясните мне что такое synchronized, что и с чем он синхонизирует, по какому принципу, и почему вывод этой программы происходит именно в такой последовательности. Экзамен на носу, а я совершенно не въезжаю в этот код. Спасите, пожалуйста...
Код

public class SynchTest  {
  public static void main( String args[] ) throws Exception {
     LockTest aLock = new LockTest();
     TryLock tester = new TryLock( aLock );
     tester.start();

     synchronized ( aLock ) {
        System.out.println( "In Block"); //1
        Thread.currentThread().sleep( 5000);
        System.out.println( "End Block"); //3
     }
  }
}
class TryLock extends Thread {
  private LockTest myLock;

  public TryLock( LockTest aLock ) {
     myLock = aLock;
  }
  public void run()   {
     System.out.println( "Start run");  //2
     myLock.enter();
     System.out.println( "End run");  //5
  }
}
class LockTest {
  public synchronized void enter() {
     System.out.println( "In enter");  //4
  }
}

/*---OUTPUT-------------------------------

In Block
Start run
End Block
In enter
End run
Press any key to continue . . .

*/

PM MAIL   Вверх
Domestic Cat
Дата 8.12.2004, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Большой вопрос smile
1. synchronized cинхронизирует потоки. Понятно, что можно запустить несколько потоков.
Теперь представь, что всем этим потокам передали ссылку на один и тот же объект с методом
method(). Потоки эти выполняются "почти одновременно", то есть, специальный поток распределяет время выполнения - сначала 1 тред выполняется в течение скажем, 20 мс, затем второй, итп. (Одновременно выполняться они не могут). Соответственно, любой поток может быть приостановлен в любой момент времени, и управление будет передано другому потоку.
Теперь предположим что метод такой
Код

method()
{
    x = calculateNewX();
    System.out.println(x);
}

Потоки 1 и 2 имеют ссылку на 1 и тот же объект. Поток 1 выполняет строку
Код

x = calculateNewX();

и изменяет х. Тут он приостанавливается, и продолжает работу поток 2, который тоже входит
в этот метод и выполняет его полностю. Понятно, что после этого поток 1 будет работать
с неверными данными, т.к. х уже была изменена потоком номер 2.
synchronized нужен для того, чтобы потоки синхронизировать, т.е. если один поток начал выполнять синхронизированный метод, никакой другой поток не может туда войти. Делается это за счет того, что поток получает некий объект, называемый "лок"; без этого лока зайти в synchronized блок нельзя.

http://forum.vingrad.ru/index.php?showtopic=24781


--------------------

PM   Вверх
Domestic Cat
Дата 8.12.2004, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Теперь по программе.

Запускаем прогу, создается поток . Он создает поток тестер и запускает его.
Далее возможны 2 варианта.

а. входит в синхронизированный блок, предварительно отобрав лок от объекта , первее, чем поток
успел выполнить. Тогда порядок будет таким, как указано: не может выполнить т.к. для этого
ему нужно получить лок от , а этот лок у . Тем не менее, возможны 2 варианта:

1 2 3 4 5
2 1 3 4 5

б. поток выполняет первым, и первым получает лок. Тогда получим кучу вариантов:

2 1 4 3 5
1 2 4 5 3
.....

Все это теоретически, ведь нигде не написано как будет распределено время выполнения.
Реально будет почти всегда 1 и тот же порядок.


--------------------

PM   Вверх
Elene
Дата 8.12.2004, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



СпасибоБ я все прочитала, но особенной ясности в понимании моего кода это не прибавило. На уровне, что 2 треда не могут запускаться одновременно мне понятно. Мне не понятно, по какой логике я должна читать подобные примеры, чтобы увидеть, что получится в результате (это надо делать без компа, так сказать в уме или на бумаге). Поэтому я хотела бы уточнить алгоритм. Пойдем по пунктам, если можно. Поправьте, пожалуйста, если что не так:
1)Вот, захожу я в мэйн и, если вижу там блок синхронайзд, я должна откинуть, все инструкции, которые заданы выше и начаю читать с него. Так?
Выполняется - System.out.println( "In Block"); //1
2) Затем я вижу, Thread.currentThread().sleep( 5000); Думаю, что currentThread() - это сам синхронайзд, и понимаю, что команда System.out.println( "End run"); не должна выполняться прямо сейчас. Кстати, вот, не понятно, если он уснул на 5 сек, то по идее все остальные команды должны успеть выполниться, и "End run" должно появиться в последнию очередь, но я вижу, что это не так.
3)Вот дальше совсем не понятно, куда идти и почему.
4)Как понять: public synchronized void enter() в классе LockTest? Как изменяется функция, если к ней добавляется synchronized? Чля ей это дает?

Остальные пункты мне пока не по силам. В общем, если можно, я бы хотела краткое объяснение, почему программа переходит именно к инструкции под номером 2, а затем к 3, 4 и 5, почему именно в такой последовательности. Как нужно читать такой код, чтобы получить правильный выход.
Я понимаю, что вопрос большой, но мне очень хочется разобраться, если можно...

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


Новичок



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

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



Спасибо, когда я писала последний постинг, Ваш ответ по программе был не виден.

А не подскажите еще, как в группе тредов MyGroup вывести на экран приоритеты всех ее тредов.



PM MAIL   Вверх
Domestic Cat
Дата 8.12.2004, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Код

Thread[] threads;
myThreadGroup.enumerate(threads);
for (int i =0; i < threads.length; i++)
{
     System.out.println("Thread "+ threads[i].getName() + " has priority " + threads[i].getPriority());
}




--------------------

PM   Вверх
Elene
Дата 8.12.2004, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо.
Можно я еще спрошу: что называют смертью треда? Это когда он полностью выполнился или, наоборот, когда не может выполнился по каким-либо причинам? После run() или мэйн, его как считать мертвым или живым?
PM MAIL   Вверх
Domestic Cat
Дата 8.12.2004, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Тред умирает когда метод run выполнен.


--------------------

PM   Вверх
Elene
Дата 9.12.2004, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо за все. Статья, на которую Вы указали, мне тоже очень помогла. Ее автору тоже большое спасибо. С экзаменом все в порядке.
PM MAIL   Вверх
Domestic Cat
Дата 9.12.2004, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата(Elene @ 9.12.2004, 08:31)
С экзаменом все в порядке.


Поздравляю smile


--------------------

PM   Вверх
ParaPik
Дата 31.3.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А в чем особенность применения модификатора synchronized со static методами? Я такое увидел в объявлении класса System стандартной библиотеки Java. 
PM MAIL   Вверх
powerOn
Дата 31.3.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Особенность в том, что синхронизация происходит на class объекте типа, метод которого вызывается. Для нестатических методов синхронизация на this.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
ParaPik
Дата 31.3.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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