supongamos que tenemos una máquina multiprocesador y una aplicación multihilo. Si dos hilos tienen acceso a un método sincronizado y se ejecutaron al mismo tiempo, ¿qué hilo obtendrá el bloqueo? o ¿qué pasará?¿Qué hilo obtendrá el bloqueo?
Gracias
supongamos que tenemos una máquina multiprocesador y una aplicación multihilo. Si dos hilos tienen acceso a un método sincronizado y se ejecutaron al mismo tiempo, ¿qué hilo obtendrá el bloqueo? o ¿qué pasará?¿Qué hilo obtendrá el bloqueo?
Gracias
El punto es que no existe tal cosa como "al mismo tiempo". Uno de los dos obtendrá el candado, pero no tienes forma de saber cuál.
No existe tal cosa "al mismo tiempo" porque, en términos generales, un bloqueo es algo que elige y ejecuta los hilos uno por uno exclusivamente.
Esto se logra naturalmente en un sistema de monoprocesador puro que puede ejecutar una instrucción a la vez. En sistemas multiprocesador, generalmente hay algún dispositivo de hardware que "bloquea" los procesadores para evitar que se ejecuten al mismo tiempo.
El comportamiento será no determinista (es decir, o hilo puede obtener el bloqueo), y puede variar de ejecución a ejecución. Esto se debe a que depende de la implementación de JVM específica y de la programación particular de sus hilos.
De acuerdo con este artículo la especificación JVM pone ninguna restricción en la equidad:
imparcialidad
El modelo de memoria de Java no especifica ningún requisito de equidad para hilos o preventivo multi-threading. Un hilo puede negarse a entregar la CPU a otro hilo y poner el sistema en punto muerto. Las reglas de equidad para otros hilos están definidas por las implementaciones de JVM individuales.
Es decir, a menos que sincronice cuidadosamente su programa, un subproceso teóricamente puede ser anulado por el planificador.
Supongo que VM tendrá que arrojar una moneda. –
Algo relacionado con http://stackoverflow.com/questions/3940164/java-waiting-on-synchronized-block-who-goes-first – Thilo
¿Eso significa que la máquina virtual tiene permitido matar de hambre a un hilo si ambos hilos intentan adquirir el bloquear en un bucle? –