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.
Если вам понравилось, буду признателен за подписку.