java - Ajuste de equidad en la clase de semáforo
multithreading semaphore (1)
Las construcciones de concurrencia incorporadas de Java ( synchronized
, wait()
, notify()
, ...) no especifican qué subproceso debe liberarse cuando se libera un bloqueo. Depende de la implementación de JVM decidir qué algoritmo usar.
La imparcialidad le da más control: cuando se libera el bloqueo, el hilo con el tiempo de espera más largo recibe el bloqueo (procesamiento FIFO). Sin imparcialidad (y con un algoritmo muy malo) puede tener una situación en la que un subproceso siempre está esperando el bloqueo porque hay un flujo continuo de otros subprocesos.
Si el Semáforo está configurado para ser justo, hay una pequeña sobrecarga porque necesita mantener una cola de todos los subprocesos que esperan el bloqueo. ¡A menos que esté escribiendo una aplicación de alto rendimiento / alto rendimiento / muchos núcleos, probablemente no verá la diferencia!
Escenario donde la imparcialidad no es necesaria
Si tiene N subprocesos de trabajo idénticos, no importa cuál obtiene una tarea para ejecutar
Escenario donde se necesita justicia
Si tiene N colas de tareas, no querrá que una cola esté esperando para siempre y nunca obtenga el bloqueo.
Estoy tratando de entender la utilidad de la propiedad de equidad en la clase de Semaphore
.
Específicamente para citar el Javadoc menciona que:
En general, los semáforos que se usan para controlar el acceso a los recursos deben inicializarse como justos, para garantizar que no se pierda ningún hilo al acceder a un recurso. Cuando se usan semáforos para otros tipos de control de sincronización, las ventajas de rendimiento de un orden no justo a menudo superan las consideraciones de imparcialidad.
¿Podría alguien proporcionar un ejemplo en el que se pueda desear barging aquí? No puedo pensar en el caso de uso de acceso a recursos pasado. Además, ¿por qué es que el valor predeterminado es un comportamiento no justo?
Por último, ¿existen implicaciones de rendimiento en el uso del comportamiento de imparcialidad?