Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Код который на 100% приводит к deadlock

#java #многопоточность


Мне нужно написать максимально простой код который в 100% случаев запуска будет приводить
к взаимной блокировке, но все примеры которые я рассматриваю дают только некоторую
вероятность. Возможно ли такое написать, если да, то как бы это могло выглядеть в самом
простом варианте?
    


Ответы

Ответ 1



public class TestThread { public static Object Lock1 = new Object(); public static Object Lock2 = new Object(); public static void main(String args[]) { ThreadDemo1 T1 = new ThreadDemo1(); ThreadDemo2 T2 = new ThreadDemo2(); T1.start(); T2.start(); } private static class ThreadDemo1 extends Thread { public void run() { synchronized (Lock1) { System.out.println("Thread 1: Holding lock 1..."); try { Thread.sleep(10); } catch (InterruptedException e) {} System.out.println("Thread 1: Waiting for lock 2..."); synchronized (Lock2) { System.out.println("Thread 1: Holding lock 1 & 2..."); } } } } private static class ThreadDemo2 extends Thread { public void run() { synchronized (Lock2) { System.out.println("Thread 2: Holding lock 2..."); try { Thread.sleep(10); } catch (InterruptedException e) {} System.out.println("Thread 2: Waiting for lock 1..."); synchronized (Lock1) { System.out.println("Thread 2: Holding lock 1 & 2..."); } } } } } Источник

Ответ 2



Проще всего, наверное, запустить в одном synchronized-методе ожидание самого себя в другом потоке. public synchronized static void deadlock() { try { Thread t = new Thread(Test::deadlock); t.start(); t.join(); } catch (Exception ex) {} } Проверка: http://ideone.com/yTbiKY Ещё более короткий блокирующийся код: new Semaphore(0).acquire(); но в нём нет многопоточности, так что это в зависимости от вашего представления может или может не быть deadlock'ом. Проверка: http://ideone.com/k1izqy

Комментариев нет:

Отправить комментарий