Урок 20

Взаимная блокировка


Особый тип ошибок, которого следует избегать, имеющий отношение к многозадачности это взаимная блокировка (deadlock), которая происходит, когда потоки имеют циклическую зависимость от пары синхронизированных объектов.

Например, две девочки Маша и Даша в детском саду делают аппликацию. Для работы каждой нужны ножницы и цветная бумага. Предположим Маша взяла ножницы (поток Маша вошла в монитор объекта ножницы), а Даша бумагу (поток Даша вошла в монитор объекта бумага). Каждая из них ждет другой предмет и не хочет делиться тем, что взяла. Они не могут продолжить свою работу и будут ждать вечно (пока воспитательница не поможет им).

Взаимная блокировка

Пример 1. Взаимная блокировка

public class DeadlockRisk implements Runnable {
    private static class Resource {
        private int value;
    }

    private Resource scissors = new Resource();
    private Resource paper = new Resource();

    public void doSun() {
        synchronized (scissors) { // May deadlock here
            System.out.println(Thread.currentThread().getName() + " взяла ножницы");
            synchronized (paper) {
                System.out.println(Thread.currentThread().getName() + " взяла бумагу");
                System.out.println(Thread.currentThread().getName() + " вырезает солнышко");
            }
        }
    }

    public void doCloud() {
        synchronized (paper) { // May deadlock here
            System.out.println(Thread.currentThread().getName() + " взяла бумагу");
            synchronized (scissors) {
                System.out.println(Thread.currentThread().getName() + " взяла ножницы");
                System.out.println(Thread.currentThread().getName() + " вырезает облачко");
            }
        }
    }

    public void run() {
        doSun();
        doCloud();
    }

    public static void main(String[] args) {
        DeadlockRisk job = new DeadlockRisk();
        Thread masha = new Thread(job, "Маша");
        Thread dasha = new Thread(job, "Даша");
        masha.start();
        dasha.start();
    }
}


0 comments
Leave your comment: