Найти в Дзене
DEBAGanov

Java 1567. Deadlock, Race condition.

Deadlock Deadlock (зависание) - это ситуация, когда два или более потока программы блокируются и ожидают друг друга, чтобы освободить ресурсы, необходимые для продолжения выполнения. В результате ни один из потоков не может продолжить свою работу, и программа останавливается.

Deadlock может возникнуть, когда выполнены следующие условия:

  • Взаимная блокировка (Mutual Exclusion): Ресурсы, такие как объекты или переменные, могут быть доступны только одному потоку одновременно.
  • Взаимная ожидание (Hold and Wait): Потоки удерживают ресурсы, которые имеют, и ожидают освобождения других ресурсов, которые им нужны для продолжения выполнения.
  • Непрерываемость (No Preemption): Ресурсы не могут быть принудительно изъяты у потоков, которые их удерживают.
  • Циклическая зависимость (Circular Wait): Существует цикл потоков, где каждый поток ожидает ресурс, удерживаемый следующим потоком в цепочке.
  • Deadlock может возникнуть в Java, когда потоки конкурируют за доступ к общим ресурсам, таким как объекты или переменные. Если потоки блокируются и ожидают друг друга, чтобы освободить ресурсы, может возникнуть deadlock.

Пример Deadlock в Java:

public class DeadlockExample {
private static Object resource1 = new Object();
private static Object resource2 = new Object();

public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (resource1) {
System.out.println("Thread 1: Удерживает resource1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resource2) {
System.out.println("Thread 1: Удерживает resource2");
}
}
});

Thread thread2 = new Thread(() -> {
synchronized (resource2) {
System.out.println("Thread 2: Удерживает resource2");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resource1) {
System.out.println("Thread 2: Удерживает resource1");
}
}
});

thread1.start();
thread2.start();
}
}

Race condition Race condition (гонка состояний) - это ситуация, когда результат выполнения программы зависит от того, в каком порядке выполняются операции несколькими потоками. Если порядок выполнения операций не определен или не синхронизирован, то результат может быть непредсказуемым и некорректным.

Race condition может возникнуть, когда два или более потока конкурируют за доступ и изменение общих данных. Если эти потоки выполняют операции чтения и записи одновременно без синхронизации, то может возникнуть гонка состояний.

В Java race condition может возникнуть, например, когда несколько потоков пытаются одновременно изменить одну и ту же переменную без синхронизации. Результат может быть непредсказуемым, так как значения переменной могут перезаписываться и перекрываться друг другом.

Пример Race condition в Java:

public class RaceConditionExample {
private static int counter = 0;

public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter++;
}
});

Thread thread2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter++;
}
});

thread1.start();
thread2.start();

try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("Counter: " + counter);
}
}

В этом примере два потока инкрементируют одну и ту же переменную counter на 1000 раз каждый. Однако, из-за отсутствия синхронизации, результат может быть непредсказуемым и меньше ожидаемого значения 2000.

3019 вопрос-ответ по Java

Курс Spring Framework

Tелеграмм каналDEBAGanov

Мое резюмеDEBAGanov

Если вам понравилось, буду признателен за подписку.