Найти тему
DEBAGanov

Java 481. Что такое мьютекс?

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

Мьютекс позволяет блокировать доступ к общему ресурсу одним потоком исполнения, чтобы другие потоки не могли изменять общий ресурс в то время, когда этим занимается первый поток. Когда первый поток завершает работу с общим ресурсом, он освобождает мьютекс, и другой поток может получить доступ к этому ресурсу.

В ОС Windows мьютекс представляется объектом ядра операционной системы и управляется функциями из WinAPI. В Unix-подобных ОС мьютекс представлен как структура данных и управляется функциями из библиотеки pthreads.

Пример кода на C++, который демонстрирует работу мьютекса:

#include <iostream>
#include <mutex>
#include <thread>

std::mutex mtx; // Создаем объект мьютекса
void threadFunc(int id) {
for (int i = 0; i < 5; i++) {
mtx.lock(); // Блокируем мьютекс
std::cout << "Thread " << id << " is working" << std::endl;
mtx.unlock(); // Освобождаем мьютекс }
}

int main() {
std::thread t1(threadFunc, 1);
std::thread t2(threadFunc, 2);

t1.join();
t2.join();

return 0;
}

В этом примере мы создаем два потока t1 и t2, которые вызывают функцию threadFunc() с разными аргументами. Функция threadFunc() содержит цикл, который выполняется 5 раз. В каждой итерации цикла поток блокирует мьютекс, выводит сообщение на консоль и освобождает мьютекс.

Если запустить эту программу, то ее результат будет похожим на следующий:

Thread 1 is working
Thread 1 is working
Thread 1 is working
Thread 1 is working
Thread 1 is working
Thread 2 is working
Thread 2 is working
Thread 2 is working
Thread 2 is working
Thread 2 is working

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

1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions

Tелеграмм канал: https://t.me/DEBAGanov

Мое резюме: https://github.com/DEBAGanov