Есть ли у каждого экземпляра Java-класса свой мьютекс?

«Есть ли у каждого экземпляра Java-класса свой мьютекс?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые моменты:

  1. Монитор объекта: У каждого экземпляра есть встроенный монитор, который используется конструкцией synchronized. Это не отдельный объект, а внутренний механизм JVM.
  2. Явные мьютексы: Для более гибкой синхронизации используются отдельные объекты-мьютексы, например, java.util.concurrent.locks.ReentrantLock.

Примеры:

  • Использование встроенного монитора (synchronized):

    public class Counter {
        private int value;
        // Монитор экземпляра 'this' используется для синхронизации
        public synchronized void increment() {
            value++;
        }
    }
  • Явное создание мьютекса (ReentrantLock):

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class Counter {
        private int value;
        private final Lock lock = new ReentrantLock(); // Явный мьютекс
    
        public void increment() {
            lock.lock();
            try {
                value++;
            } finally {
                lock.unlock(); // Важно освобождать в finally-блоке
            }
        }
    }