← Назад ко всем вопросам

Что такое race condition и thread-safety?

1️⃣ Как кратко ответить

Race condition — это ситуация, когда результат работы программы зависит от порядка выполнения потоков, что может привести к ошибкам. Thread-safety — это свойство кода, которое гарантирует корректное поведение программы при одновременном выполнении нескольких потоков.

2️⃣ Подробное объяснение темы

Race condition и thread-safety — это ключевые концепции в многопоточном программировании, которые необходимо понимать для разработки надежных и корректных приложений.

Race Condition

Race condition возникает, когда два или более потока одновременно обращаются к общему ресурсу (например, переменной или файлу) и как минимум один из потоков изменяет этот ресурс. Поскольку потоки могут выполняться в произвольном порядке, результат работы программы может быть непредсказуемым и зависеть от того, какой поток первым завершит свою работу.

Пример: Представьте, что у вас есть счетчик, который увеличивается двумя потоками:

public class Counter {
    private int count = 0;
​
    public void increment() {
        count++;
    }
​
    public int getCount() {
        return count;
    }
}
​
public class RaceConditionExample {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();
​
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
​
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
​
        t1.start();
        t2.start();
        t1.join();
        t2.join();
​
        System.out.println("Final count: " + counter.getCount());
    }
}

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

Thread-Safety

Thread-safety — это свойство программы или кода, которое гарантирует корректное поведение при одновременном выполнении нескольких потоков. Это достигается за счет синхронизации доступа к общим ресурсам, чтобы избежать race condition.

Пример: Сделаем предыдущий пример thread-safe с использованием ключевого слова synchronized:

public class SafeCounter {
    private int count = 0;
​
    public synchronized void increment() {
        count++;
    }
​
    public synchronized int getCount() {
        return count;
    }
}
​
public class ThreadSafeExample {
    public static void main(String[] args) throws InterruptedException {
        SafeCounter counter = new SafeCounter();
​
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
​
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
​
        t1.start();
        t2.start();
        t1.join();
        t2.join();
​
        System.out.println("Final count: " + counter.getCount());
    }
}

В этом примере методы increment и getCount объявлены как synchronized, что гарантирует, что только один поток может выполнять их в любой момент времени. Это предотвращает race condition и делает код thread-safe.

Зачем это нужно?

Понимание и предотвращение race condition важно для обеспечения корректности и надежности многопоточных приложений. Thread-safety позволяет разработчикам создавать программы, которые работают правильно независимо от порядка выполнения потоков, что особенно важно в многопользовательских системах и при работе с общими ресурсами.

Тема: Java
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки