В некотором смысле это хуже, чем pthread_mutex_init
, на самом деле. Из-за того, что Java ожидает/уведомляет вас о необходимости частичной мьютексы и переменной условия для реализации монитора.
На практике при внедрении JVM вы выслеживаете и применяете каждую отдельную оптимизацию для конкретной платформы в книге, а затем придумываете новые, чтобы сделать мониторы как можно быстрее. Если вы не можете сделать действительно дьявольскую работу, вы определенно не в состоянии оптимизировать сбор мусора ;-)
Одно наблюдение заключается в том, что не каждый объект должен иметь свой собственный монитор. Объект, который в настоящий момент не синхронизирован, не нуждается в нем. Таким образом, JVM может создавать пул мониторов, и каждый объект может иметь только поле указателя, которое заполняется, когда поток фактически хочет синхронизировать объект (например, с помощью операции атомного сравнения и операции свопинга для конкретной платформы). Таким образом, стоимость инициализации монитора не должна увеличивать стоимость создания объекта. Предполагая, что память предварительно очищена, создание объекта может быть: декремент указателя (плюс некоторая проверка границ, с предсказанной ложной ветвью к коду, который запускает gc и т. Д.); заполните тип; вызов самого производного конструктора. Я думаю, вы можете организовать для конструктора Object ничего не делать, но, очевидно, многое зависит от реализации.
На практике среднее Java-приложение не синхронизируется на очень многих объектах в любой момент времени, поэтому пулы мониторинга потенциально представляют собой огромную оптимизацию во времени и в памяти.
Возможно, вам захочется указать, с какой платформы вы работаете, поскольку потоки в C++ обязательно зависят от платформы. Решение с использованием pthreads будет отличаться от решения с использованием функций синхронизации Win32. –
Ну все основные платформы - MacOSX, Solaris, Windows, Linux. – Lothar