Como programador de C++ cada vez estoy más familiarizado con Java, me resulta un poco extraño ver compatibilidad a nivel de lenguaje para bloquear objetos arbitrarios sin ningún tipo de declaración de que el objeto admite dicho bloqueo. Crear mutexes para cada objeto parece ser un alto costo para ser elegido automáticamente. Además del uso de memoria, los mutex son recursos limitados del sistema operativo en algunas plataformas. Podrías girar el bloqueo si los mutex no están disponibles, pero las características de rendimiento son significativamente diferentes, lo que podría afectar la predictibilidad.¿Crea la JVM un mutex para cada objeto para implementar la palabra clave 'sincronizada'? Si no, ¿cómo?
¿Es la JVM lo suficientemente inteligente en todos los casos para reconocer que un objeto en particular nunca será el objetivo de la palabra clave sincronizada y así evitar crear el mutex? Los mutex se pueden crear de forma perezosa, pero eso plantea un problema de arranque que requiere un mutex, e incluso si eso se soluciona, supongo que todavía habrá un sobrecarga para rastrear si un mutex ya se ha creado o no. Así que supongo que si tal optimización es posible, debe hacerse en tiempo de compilación o inicio. En C++, tal optimización no sería posible debido al modelo de compilación (no se podía saber si el bloqueo de un objeto se usaría a través de los límites de la biblioteca), pero no sé lo suficiente acerca de la compilación y el enlace de Java para saber si se aplican las mismas limitaciones
Estoy bastante seguro de que 'synchronized' se maneja internamente en la JVM, en lugar de depender de los recursos del nivel del sistema operativo. –
Eso no puede ser completamente cierto. Estoy de acuerdo en que se puede implementar de cualquier forma que la JVM desee, pero la JVM necesariamente debe confiar en la comunicación a nivel de sistema operativo en algún lugar de forma interna. Puede escribir su propia clase mutex que gira bloqueos, pero si desea que el programador del sistema operativo ponga hilos para dormir y los despierte adecuadamente, en algún momento debe informar al sistema operativo acerca de su exclusión mutua, y ese tipo de registros son los limitados recurso. –
No es necesario que informe al sistema operativo acerca de su mutex; solo tiene que indicarlo cuando es necesario activar ciertos subprocesos. –