Sobes.tech
Back to questions
Junior — Middle
66

Каким образом происходят обмены данными и взаимодействия между потоками в многопоточном приложении?

Answer from AI

sobes.tech AI

В многопоточном приложении в Java обмен данными и взаимодействие между потоками происходит через общие объекты и механизмы синхронизации. Основные способы:

  • Общие переменные и объекты: Потоки могут читать и изменять общие данные, но для предотвращения состояния гонки используется синхронизация.
  • Ключевое слово synchronized: Позволяет блокировать доступ к критической секции кода, чтобы только один поток мог её выполнять.
  • Классы из пакета java.util.concurrent: Например, Lock, Semaphore, CountDownLatch, CyclicBarrier для более гибкой синхронизации.
  • Взаимодействие через очереди: Потоки могут обмениваться данными через потокобезопасные очереди, например, BlockingQueue.
  • Методы wait(), notify(), notifyAll(): Позволяют потокам ждать определённого состояния и уведомлять друг друга о его изменении.

Пример использования synchronized и wait/notify:

class SharedResource {
    private int data;
    private boolean available = false;

    public synchronized void produce(int value) throws InterruptedException {
        while (available) {
            wait();
        }
        data = value;
        available = true;
        notify();
    }

    public synchronized int consume() throws InterruptedException {
        while (!available) {
            wait();
        }
        available = false;
        notify();
        return data;
    }
}

Таким образом, взаимодействие строится на контроле доступа к общим данным и уведомлении потоков о событиях.