Ответ
Нет, не у каждого. Мьютекс (примитив синхронизации) — это не свойство экземпляра по умолчанию, а объект, который нужно явно создать и использовать.
Ключевые моменты:
- Монитор объекта: У каждого экземпляра есть встроенный монитор, который используется конструкцией
synchronized. Это не отдельный объект, а внутренний механизм JVM. - Явные мьютексы: Для более гибкой синхронизации используются отдельные объекты-мьютексы, например,
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-блоке } } }