Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки и синхронизация. Дедлок / 10 сообщений из 10, страница 1 из 1
24.09.2012, 11:06:54
    #37969542
rasmtp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
Всем здрасти). Пытаюсь познакомиться с потоками в java.
Есть очень простой код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public abstract class SomeClass implements Runnable {
   private Object lock = new Object();
   public void lock() {
      synchronized(lock) {
         try {
            lock.wait();
            System.out.println("1");
         } catch (InterruptedException ex) {}
      }
   }
   
   public void unlock() {
      synchronized(lock) {
         lock.notify();
         System.out.println("2");
      }
   }

   public static void main(String[] args) {
      new Thread(new SomeClass() {
         public void run() {
            lock();
         }
      }).start();

      new Thread(new SomeClass() {
         public void run() {
            unlock();
         }
      }).start();
   }
}


из теста на intuit.ru к лекции http://www.intuit.ru/department/pl/javapl/class/free/12/.
Собственно, вопрос - почему тут дедлок?
...
Рейтинг: 0 / 0
24.09.2012, 11:16:16
    #37969555
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
Обязательное условие возникновения дедлока это минимум два потока и минимум два критических ресурса. Здесь же у нас только один критический ресурс - lock. Откуда взяться взаимоблокировке, немного не понятно.
...
Рейтинг: 0 / 0
24.09.2012, 11:16:40
    #37969556
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
BlazkowiczОбязательное условие возникновения дедлока это минимум два потока и минимум два критических ресурса. Здесь же у нас только один критический ресурс - lock. Откуда взяться взаимоблокировке, немного не понятно.
Ааа.. Тю, SomeClass два раза создаётся.
...
Рейтинг: 0 / 0
24.09.2012, 11:18:31
    #37969560
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
Тогда не понятно где тут вообще блокировки, у каждого потока свой лок. Второй поток ничего не знает про состояние первого и не может им упралять, так как лок у них не общий.
...
Рейтинг: 0 / 0
24.09.2012, 11:20:58
    #37969568
rasmtp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
Тогда я, видимо, путаю понятия.
При компиляции и выполнении этого кода я постоянно в консоли получаю "2" и программа не завершается. Интересно, почему?
...
Рейтинг: 0 / 0
24.09.2012, 11:22:30
    #37969572
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
rasmtpПри компиляции и выполнении этого кода я постоянно в консоли получаю "2" и программа не завершается. Интересно,
почему?
Потому что первый поток "засыпает" на
lock.wait();
и никто его нигде не будит
...
Рейтинг: 0 / 0
24.09.2012, 11:24:39
    #37969577
rasmtp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
BlazkowiczТогда не понятно где тут вообще блокировки, у каждого потока свой лок. Второй поток ничего не знает про состояние первого и не может им упралять, так как лок у них не общий.
ааа).. получается, первый поток так и будет висеть, потому что некому его разблокировать).
...
Рейтинг: 0 / 0
24.09.2012, 11:26:04
    #37969581
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
rasmtpааа).. получается, первый поток так и будет висеть, потому что некому его разблокировать).
нет. wait() это не "блокировка". "блокирвка" это synchronized. wait() это прямое указание потоку ждать.
...
Рейтинг: 0 / 0
24.09.2012, 11:26:20
    #37969583
rasmtp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
как все просто). спасибо большое. буду внимательнее.
...
Рейтинг: 0 / 0
28.09.2012, 22:27:23
    #37976683
ResidentR6
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки и синхронизация. Дедлок
На будущее - возьми лочки из пакета java.util.concurrent
они намного удобнее в пользовании, чем Object.

Что лок, что Обджект можно (и нужно) использовать как объект. В
частности отдавать в другой поток как параметр функции или конструктора.

Типичный пример:

final Object lock = new Object();
synchronized(lock){
new Thread(){ public void run(){
synchronized(lock){
try{я тута чего-то творю
}finally{lock.notify();}
}
}}.start();
lock.wait();
}

Как видишь, дёшево и сердито новый анонимный поток кушает лочку.
Фактически при этом она идёт в конструктор потоку (при компиляции).
Заметь, насколько кратко и понятно выглядит конструкция, при этом не
требующая дополнительных объявлений. Всё в одном месте кода.

Если поток делать именованным классом, принимай лочку в конструкторе, но
задействуй только внутри метода run(). В противном случае не сможешь
гарантировать что новый поток не успеет отработать до того как
порождающий заснёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки и синхронизация. Дедлок / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]