powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки и синхронизация. Дедлок
10 сообщений из 10, страница 1 из 1
Потоки и синхронизация. Дедлок
    #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
Потоки и синхронизация. Дедлок
    #37969555
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обязательное условие возникновения дедлока это минимум два потока и минимум два критических ресурса. Здесь же у нас только один критический ресурс - lock. Откуда взяться взаимоблокировке, немного не понятно.
...
Рейтинг: 0 / 0
Потоки и синхронизация. Дедлок
    #37969556
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОбязательное условие возникновения дедлока это минимум два потока и минимум два критических ресурса. Здесь же у нас только один критический ресурс - lock. Откуда взяться взаимоблокировке, немного не понятно.
Ааа.. Тю, SomeClass два раза создаётся.
...
Рейтинг: 0 / 0
Потоки и синхронизация. Дедлок
    #37969560
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда не понятно где тут вообще блокировки, у каждого потока свой лок. Второй поток ничего не знает про состояние первого и не может им упралять, так как лок у них не общий.
...
Рейтинг: 0 / 0
Потоки и синхронизация. Дедлок
    #37969568
rasmtp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда я, видимо, путаю понятия.
При компиляции и выполнении этого кода я постоянно в консоли получаю "2" и программа не завершается. Интересно, почему?
...
Рейтинг: 0 / 0
Потоки и синхронизация. Дедлок
    #37969572
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasmtpПри компиляции и выполнении этого кода я постоянно в консоли получаю "2" и программа не завершается. Интересно,
почему?
Потому что первый поток "засыпает" на
lock.wait();
и никто его нигде не будит
...
Рейтинг: 0 / 0
Потоки и синхронизация. Дедлок
    #37969577
rasmtp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczТогда не понятно где тут вообще блокировки, у каждого потока свой лок. Второй поток ничего не знает про состояние первого и не может им упралять, так как лок у них не общий.
ааа).. получается, первый поток так и будет висеть, потому что некому его разблокировать).
...
Рейтинг: 0 / 0
Потоки и синхронизация. Дедлок
    #37969581
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rasmtpааа).. получается, первый поток так и будет висеть, потому что некому его разблокировать).
нет. wait() это не "блокировка". "блокирвка" это synchronized. wait() это прямое указание потоку ждать.
...
Рейтинг: 0 / 0
Потоки и синхронизация. Дедлок
    #37969583
rasmtp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как все просто). спасибо большое. буду внимательнее.
...
Рейтинг: 0 / 0
Потоки и синхронизация. Дедлок
    #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
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки и синхронизация. Дедлок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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