Symulacja deadlocka z ograniczeniem czasowym

0

Witam.

Mam za zadanie napisać symulację deadlocka z ograniczeniem na to zjawisko tj. po pewnym czasie ma ono się zakończyć. Napisałem taki kod:


import java.util.Arrays;
import java.util.concurrent.*;

public class Deadlock {

    private final Object lock1 = new Object();
    private final Object lock2 = new Object();
    private long lengthOfEvent;

    public Deadlock(long lengthOfEvent) {
        this.lengthOfEvent = lengthOfEvent;
    }

    public void produceDeadLock() throws InterruptedException {

        Callable<Void> threadOne = () -> {
            synchronized(lock1) {
                    System.out.println("Thread 1 got lock1");
                    synchronized (lock2) {
                        System.out.println("Thread 2 got lock2");
                    }
            }
            return null;
        };

        Callable<Void> threadTwo = () -> {
            synchronized(lock2) {
                    System.out.println("Thread 2 got lock2");
                    synchronized (lock1) {
                        System.out.println("Thread 2 got lock1");
                    }
            }
            return null;
        };

        ExecutorService execService = Executors.newFixedThreadPool(2);
        execService.invokeAll(Arrays.asList(threadOne, threadTwo), lengthOfEvent, TimeUnit.SECONDS);
        execService.shutdown();
        System.out.println("After deadlock simulation finished!");
    }

}

Jednakże po powrocie do metody main program się "zawiesza" wnioskuję, że jest to sprawa tego, że wątki wewnątrz serwisu są zablokowane wątki, którym ustawiam tylko bit interrupted. Może ktoś podpowiedzieć mi w jaki sposób zrealizować to "ograniczenie" czasowe?

0

Wywołaj sobie czekanie na zasób w osobnym wątku i ustaw na niego timeout, po którym na przykład leci exception.

1

Może zamiast bloku synchronized wykorzystaj semafory, wtedy robisz trzeci wątek, w którym po określonym czasie robisz release na obu, co powinno odblokować deadlock'a.

package com.sda.java.jp.deadlock;

import java.util.Arrays;
import java.util.concurrent.*;

public class DeadlockDemo {

        private final Object lock1 = new Object();
        private final Object lock2 = new Object();
        private final Semaphore s1 = new Semaphore(1);
        private final Semaphore s2 = new Semaphore(1);
        private long lengthOfEvent;

        public DeadlockDemo(long lengthOfEvent) {
            this.lengthOfEvent = lengthOfEvent;
        }

        public void produceDeadLock() throws InterruptedException {

            Callable<Void> threadOne = () -> {
                s1.acquire();
                Thread.sleep(100);
                System.out.println("Thread 1 got lock1");
                System.out.println("Thread 1 trying get lock2");
                s2.acquire();
                System.out.println("Thread 1 got lock2");
                return null;
            };

            Callable<Void> threadTwo = () -> {
                s2.acquire();
                Thread.sleep(100);
                System.out.println("Thread 2 got lock2");
                System.out.println("Thread 2 trying get lock1");
                s1.acquire();
                System.out.println("Thread 2 got lock1");
                return null;
            };

            Callable<Void> threadThree = () -> {
                System.out.println("Monitor start, wait 2 sec to end of deadlock");
                Thread.sleep(2000);
                s1.release();
                s2.release();
                System.out.println("End of deadlock");
                return null;
            };

            ExecutorService execService = Executors.newFixedThreadPool(3);
            execService.invokeAll(Arrays.asList(threadOne, threadTwo, threadThree), lengthOfEvent, TimeUnit.SECONDS);
            execService.shutdown();
            System.out.println("After deadlock simulation finished!");
        }

        public static void main(String[] args) throws InterruptedException {
            DeadlockDemo d = new DeadlockDemo(100);
            d.produceDeadLock();
        }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1