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

Java 478. Что такое блокировка объекта или монитор?

Блокировка объекта, также известная как монитор объекта, является механизмом в Java, который позволяет синхронизировать доступ к общему ресурсу из нескольких потоков. Каждый объект в Java имеет свой монитор (блокировку), который может быть использован для синхронизации выполнения кода.

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

Вот пример кода на Java, который показывает блокировку объекта:

public class Main {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object(); // Создаем новый объект
Thread thread1 = new Thread(new MyRunnable(lock));
Thread thread2 = new Thread(new MyRunnable(lock));

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

class MyRunnable implements Runnable {
private Object lock;

public MyRunnable(Object lock) {
this.lock = lock;
}

public void run() {
synchronized(lock) { // Получаем монитор объекта lock System.out.println(Thread.currentThread().getName() + " has acquired the lock");
try {
Thread.sleep(3000);
// Приостанавливаем выполнение текущего потока на 3 секунды
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " is releasing the lock");
} // Освобождаем монитор объекта lock }
}

В этом примере мы создаем два потока исполнения, которые будут использовать общий объект lock. Метод run() каждого потока содержит блокировку объекта lock, который удерживается в течение 3 секунд. Во время ожидания первый поток удерживает монитор объекта lock, а второй поток блокируется, пока первый поток не освободит монитор.

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

Thread-0 has acquired the lock
(ожидание 3 секунды)
Thread-0 is releasing the lock
Thread-1 has acquired the lock
(ожидание 3 секунды)
Thread-1 is releasing the lock

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

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

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

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