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

326
01 мая 2017, 01:03

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

Answer 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...");
            }
         }
      }
   } 
}

Источник

Answer 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

READ ALSO
Создание папки программным способом Android

Создание папки программным способом Android

Пишу для курсовой работы примитивный файловый менеджерХочу создать кнопку которая будет создавать новую папку

419
Не могу найти утечку памяти

Не могу найти утечку памяти

Приложение получает изображение от клиента по UDP и пока что выводит его в LabelBackground

328
Как Extended WPF Toolkit добавить в ToolBox

Как Extended WPF Toolkit добавить в ToolBox

Скачал через NuGet Extended WPF Toolkit

318