Как программист на С++, более знакомый с Java, мне немного странно видеть поддержку уровня языка для блокировки на произвольных объектах без какого-либо объявления, которое объект поддерживает такую блокировку. Создание мьютексов для каждого объекта выглядит как высокая стоимость, на которую автоматически выбирается. Кроме использования памяти, мьютексы являются ограниченным ресурсом ОС на некоторых платформах. Вы можете блокировать блокировку, если мьютексы недоступны, но характеристики производительности значительно различаются, что я ожидаю, что урон предсказуем.
Является ли JVM достаточно умным во всех случаях, чтобы признать, что конкретный объект никогда не станет целью синхронизированного ключевого слова и, таким образом, избежать создания мьютекса? Мьютексы могут создаваться лениво, но это создает проблему самонастройки, которая сама по себе требует мьютекса, и даже если бы это было сработано, я предполагаю, что все еще будут некоторые накладные расходы для отслеживания того, был ли уже создан мьютекс или нет. Поэтому я предполагаю, что такая оптимизация возможна, она должна выполняться во время компиляции или запуска. В С++ такая оптимизация невозможна из-за модели компиляции (вы не могли знать, будет ли блокировка для объекта использоваться для границ библиотеки), но я недостаточно знаю о компиляции Java и связывании с ней если применяются те же ограничения.