С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668

Как избавить от deadlock через Lock

31.03.2014, 00:44. Показов 2343. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть простой вариант deadlock:
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
public class SimpleDeadLock {
    public static void main(String [] args) throws InterruptedException {
        final Integer integer1 = new Integer(1);
        final Integer integer2 = new Integer(2);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    foo (integer1,integer2);
                } catch (InterruptedException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        }).start();
        foo(integer2,integer1);
    }
    public static void foo(Integer integer1, Integer integer2) throws InterruptedException {
        System.out.println("Thread with id="+Thread.currentThread().getId()+" inside foo");
        synchronized (integer1){
            System.out.println("Thread with id="+Thread.currentThread().getId()+" inside first sync");
            Thread.sleep(100);
            synchronized (integer2){
               System.out.println("Thread with id="+Thread.currentThread().getId()+" inside both sync");
            }
        }
    }
}
пытаюсь избавиться от дедлока через lock:

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
public class SimpleDeadLock {
    public static void main(String[] args) throws InterruptedException {
        final Integer integer1 = new Integer(1);
        final Integer integer2 = new Integer(2);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    foo(integer1, integer2);
                } catch (InterruptedException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        }).start();
        foo(integer2, integer1);
    }
 
    public static void foo(Integer integer1, Integer integer2) throws InterruptedException {
        System.out.println("Thread with id=" + Thread.currentThread().getId() + " inside foo");
        Lock lock = new ReentrantLock();
        lock.lock();
        try {
            System.out.println("Thread with id=" + Thread.currentThread().getId() + " inside try before sleep");
            Thread.sleep(100);
            System.out.println("Thread with id=" + Thread.currentThread().getId() + " inside try after sleep");
        } finally {
            lock.unlock();
        }
    }
}
от дедлока то я избавился, но в соответствии с выводом, локаньем я ничего не добился вывод:

Thread with id=1 inside foo
Thread with id=10 inside foo
Thread with id=10 inside try before sleep
Thread with id=1 inside try before sleep
Thread with id=1 inside try after sleep
Thread with id=10 inside try after sleep
я предполагал, что действие before и after происходит обязательно последовательно и остальные потоки ждут.


Что я делаю не так?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2014, 00:44
Ответы с готовыми решениями:

Как здесь происходит DeadLock?
Всем привет, такой пример, кто может объяснить как здесь дедлочатся потоки, что даже ни один поток не заходит в метод bowBack? Никак не...

[SQL Server]Transaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock viсtim.
1С 7.7, сервер win2003, 4 клиентские машины с ХР - на одной из них все время вылетает ошибка: SQL State: 40001 Native: 1205 ...

Acer aspire 5552G-N974G64Mikk Проблема с Caps Lock, Num Lock, Scroll Lock
Вообщем у меня такая же проблемма https://www.cyberforum.ru/notebooks/thread552722.html Небольшая проблема на ноутбуке, когда...

6
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
31.03.2014, 01:00
Цитата Сообщение от gredwhite Посмотреть сообщение
Что я делаю не так?
Используете два разных ReentrantLock-а, а надо один

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

PS. Обычно deadlock обходится декларированием глобального порядка захвата локов.
Например, если в методе foo сравнивать integer1 и integer2, и захватывать монитор на том, который оказался меньше - тот дедлока не будет.
1
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
31.03.2014, 01:11  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
У вас какая-то неравносильная замена: в первом варианте у вас два лока, а во втором всего один.
я хотел как-бы synchronized на метод сделать

Добавлено через 1 минуту
Цитата Сообщение от turbanoff Посмотреть сообщение
Используете два разных ReentrantLock-а, а надо один
то есть его можно филдом в классе SimpleDeadLock сделать?

Добавлено через 1 минуту
Цитата Сообщение от turbanoff Посмотреть сообщение
Обычно deadlock обходится декларированием глобального порядка захвата локов.
Например, если в методе foo сравнивать integer1 и integer2, и захватывать монитор на том, который оказался меньше - тот дедлока не будет.
что-то не до конца понял. покажете код?

Добавлено через 6 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
 public static void foo(Integer integer1, Integer integer2) throws InterruptedException {
        System.out.println("Thread with id=" + Thread.currentThread().getId() + " inside foo");
        synchronized (integer1<integer2? integer1:integer2 ) {
            System.out.println("Thread with id=" + Thread.currentThread().getId() + " inside first sync");
            Thread.sleep(100);
            synchronized (integer1<integer2? integer2:integer1 ) {
                System.out.println("Thread with id=" + Thread.currentThread().getId() + " inside both sync before sleep");
                Thread.sleep(100);
                System.out.println("Thread with id=" + Thread.currentThread().getId() + " inside both sync after sleep");
            }
        }
    }
так желаемого результата я не добился

=>
Thread with id=1 inside foo
Thread with id=10 inside foo
Thread with id=1 inside first sync
Thread with id=10 inside try before sleep
Thread with id=1 inside both sync before sleep
Thread with id=10 inside try after sleep
Thread with id=1 inside both sync after sleep
====================

я кажется криворукий. запускать не умею.
Вроде бы достиг правильного результата.

turbanoff, что скажете?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
31.03.2014, 07:59
Лучший ответ Сообщение было отмечено gredwhite как решение

Решение

Цитата Сообщение от gredwhite Посмотреть сообщение
то есть его можно филдом в классе SimpleDeadLock сделать?
Или полем, или передавать как параметр в foo.
Цитата Сообщение от gredwhite Посмотреть сообщение
так желаемого результата я не добился
Вы уверены что пересобрали программу перед запуском? У меня ваш последний вариант работает правильно.
Thread with id=1 inside foo
Thread with id=11 inside foo
Thread with id=1 inside first sync
Thread with id=1 inside both sync before sleep
Thread with id=1 inside both sync after sleep
Thread with id=11 inside first sync
Thread with id=11 inside both sync before sleep
Thread with id=11 inside both sync after sleep
0
53 / 53 / 14
Регистрация: 26.02.2014
Сообщений: 150
01.04.2014, 13:29
Цитата Сообщение от gredwhite Посмотреть сообщение
Обычно deadlock обходится декларированием глобального порядка захвата локов.
Например, если в методе foo сравнивать integer1 и integer2, и захватывать монитор на том, который оказался меньше - тот дедлока не будет.
что-то не до конца понял. покажете код?
Говоря проще, если все потоки будут захватывать
1. одни и те же мониторы/локи
2. в одинаковом порядке,
есть гарантия, что не будет ДЛ.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
01.04.2014, 15:26  [ТС]
Цитата Сообщение от bigwhitefish Посмотреть сообщение
есть гарантия, что не будет ДЛ.
кого, простите, не будет?
0
53 / 53 / 14
Регистрация: 26.02.2014
Сообщений: 150
01.04.2014, 15:29
дедлока
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.04.2014, 15:29
Помогаю со студенческими работами здесь

Вывести на экран в символическом виде состояние NUM LOCK, CAPS LOCK и SCROLL LOCK
Помогите решить задачку на турбо си Выводить на экран в символическом виде состояние NUM LOCK, CAPS LOCK и SCROLL LOCK (вкл. / выкл.),...

Клавиатура мигает всеми тремя индикаторами Caps Lock, Scroll Lock и Num Lock и соответственно не работает!
Здравствуйте парни и девушки! Столкнулся с такой проблемой! Имеется клавиатура Genius Ergomedia 700! Так вот. Начал замечать интересную...

Работа с клавиатурой (клавиши num lock, caps lock, scroll lock)
определить состояние статуса клавиш &quot; num lock, caps lock,scroll lock &quot; с отображением и их измением на экране

Как заменить ScroLL Lock на Caps Lock
Как заменить чтобы вместо кнопки ScroLL Lock проверялась клавиша Caps Lock. Вот отрывок кода: h0: mov ax,40h ;Настроим ES на сегмент...

Как избавить лаги в cs:go
AMD FX(tm)-6350 Six-Core Processor Asus GeForce GTX 660 AsusTeK Computer INC. M5A78L-M LX3' Оперативная память -4 Гб. Кто...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru