Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для IVIakCollideR
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309

Дедлоки потоки

05.04.2014, 13:48. Показов 1411. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Изучаю потоки.
На сайте у Skipy нашел статью с примером дедлока, вот код:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class DeadLockTest{
    public static void main(String[] args){
        A a1 = new A();
        A a2 = new A();
        Thread t1 = new Thread(new Tester(a1,a2));
        Thread t2 = new Thread(new Tester(a2,a1));
        t1.start();
        t2.start();
    }
    public static class Tester implements Runnable{
        static int nextId = 1;
        private A obj1;//a1, a2
        private A obj2;//a2, a1
        private int id = 0;
 
        public Tester(A obj1, A obj2){
            this.obj1 = obj1;
            this.obj2 = obj2;
            id = nextId++;
            System.out.println(id);
        }
        public void run(){
            print("Setting value to obj1... ");
            obj1.setValue(id);
            print("done.");
            print("Comparing objects... ");
            print("Done. Result: "+((obj1.equals(obj2)) ? "equal" : "not equal"));
        }
        private void print(String msg){
            System.out.println("Thread #"+id+": "+msg);
        }
    }
    public static class A{
        private int value = 0;
        synchronized void setValue(int value){
            this.value = value;
        }
        synchronized int getValue(){
            return value;
        }
        public synchronized boolean equals(Object o){
            A a = (A) o;
            try{
                Thread.sleep(1000);
            }catch(InterruptedException ex){
            }
            return value == a.getValue();
        }
    }
}
объяснение к коду:
А вот дальше начинается самое интересное. Вызов equals. Поток t1 захватывает монитор на объекте a1. И ждет секунду. Приблизительно в то же самое время поток t2 захватывает монитор на объекте a2. И тоже ждет. А после ожидания каждый поток пытается захватить монитор другого объекта – a2 для t1 и a1 для t2. Поскольку мониторы уже захвачены другим потоком – происходит взаимная блокировка: потоки входят в состояние бесконечного ожидания.
что то я недопонял, где именно происходит в методе equals попытка захватить монитор другого объекта??
или это в статье опечатка? Объясните пожалуйста.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.04.2014, 13:48
Ответы с готовыми решениями:

Дедлоки для запросов select
Могут ли одновременные вызовы процедур, содержащих запросы select к одной и той же таблице, вызывать взаимные блокировки ? Есть ли...

Дедлоки между update limit N и update по primary key
Добрый день! Столкнулся с дедлоками, хотелось бы послушать опытных товарищей как с этим быть. Описание: Есть табличка CREATE...

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

4
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.04.2014, 15:03
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
где именно происходит в методе equals попытка захватить монитор другого объекта?
Захват монитора проходит перед выполнением метода equals. Это можно увидеть посмотрев на модификаторы этого метода: там присутствует synchronized
0
 Аватар для IVIakCollideR
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
05.04.2014, 15:43  [ТС]
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
Поток t1 захватывает монитор на объекте a1. И ждет секунду.
выходит что метод equals все таки выполняется.
я ставил логи в методе equals и он останавливался на вызове метода getValue, тсть не получал результат от этого метода.

я не могу понять где именно
после ожидания каждый поток пытается захватить монитор другого объекта – a2 для t1 и a1 для t2
это происходит, мб я туплю, обясните на пальцах пожалуйста)
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.04.2014, 17:02
Лучший ответ Сообщение было отмечено IVIakCollideR как решение

Решение

Монитор для второго объекта потоки пытаются захватить при вызове метода getValue (он тоже помечен как synchronized)
1
 Аватар для IVIakCollideR
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
05.04.2014, 17:11  [ТС]
меня только что осенило)
я что то вдолбил себе что раз, к примеру, обьект а1 вызывает метод булиан, то и в этом методе мы работаем с эти обьектом тсть с текущим монитором, почему то заело и все, нужно бить внимательнее )

Добавлено через 2 минуты
Цитата Сообщение от turbanoff Посмотреть сообщение
Монитор для второго объекта потоки пытаются захватить при вызове метода getValue
спасибо, в дальнейшем постараюсь бить более внимательнее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2014, 17:11
Помогаю со студенческими работами здесь

Байтовые потоки и потоки символов
Объясните, пожалуйста подробно что имелось ввиду На самом низком уровне все операции ввода/вывода в С# оперируют байтами. Подобный...

потоки
1---------------------------------------------------------------------------------------------------------- Можно ли перенаправить потоки...

Потоки
Вот простенькая программка, 2 прогресс бара и 1 кнопка. При нажатии кнопки ПБ медленно заполняются по очереди. В это время окно...

Потоки в C++
Господа, можете посоветовать хорошую книгу по потокам в C++ или мануалы какие-то что ли ? Не советуйте материал найденный в поисковике,...

Потоки
Создал поток вручную и с помощью этого кода по одному разу загрузил строку "Текст" из каждого из 10 потоков. Код отработал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru