2010-10-15 11 views
10

Esta pregunta está inspirada en this other question.Java: esperando en el bloque sincronizado, ¿quién va primero?

Si hay varios subprocesos esperando en un bloque synchronized, y el bloqueo está disponible, ¿quién va primero? ¿Es por prioridad de subproceso (y luego primero por orden de llegada)?

¿Y las mismas reglas se aplican para notify (con múltiples wait hilos de ing)?

+1

Si 'bloqueos justos' es lo que está buscando, mire el paquete java.util.concurrent. Como ejemplo, ReEntrantLocks es justo. La equidad proviene del hecho de que se da prioridad a los hilos de espera más largos, análogos al concepto de 'Envejecimiento' en la programación de procesos. – questzen

Respuesta

7

De acuerdo con este individuo: http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html

Java emite ninguna garantía sobre la secuencia. Así que supongo que no está basado en la prioridad de subprocesos

Trataré de buscar una explicación sobre cómo decide realmente quién va primero.

+2

+1 Interesante. Resulta que los bloqueos en el paquete de concurrencia tienen un modo de equidad opcional, en cuyo caso funcionan fifo. Si no, es arbitrario. Pensé que la prioridad del hilo debería jugar un papel aquí. – Thilo

+0

Estoy de acuerdo en que habría sido la elección "natural". –

+2

La equidad tiene un costo, y la previsibilidad se logra a expensas de una gran caída de rendimiento. Además, el requisito de equidad evitaría toneladas de optimizaciones que la VM podría hacer para implementar adquisiciones de bloqueo (cosas como bloqueos de giro delgados, etc.). – sjlee

1

a su segunda pregunta

uno de ellos es elegido para ser despertado. La elección es arbitraria y ocurre a discreción de la implementación. Un hilo espera en el monitor de un objeto llamando a uno de los métodos de espera.

De http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#notify()

+0

¿Alguna idea de cómo Hotspot maneja esto? – Thilo

+0

Si tomo estas dos respuestas junto con las prioridades de subprocesos que no resultan en las prioridades de subprocesos del sistema operativo en Linux (al menos en la mayoría de las situaciones), esas prioridades no parecen hacer mucho ... – Thilo

+0

@Thilo Depende de la implementación. No puedo decir que sea dependiente del sistema operativo. –

0

Depende de la prioridad de subprocesos y del algoritmo de programación de subprocesos y también el bloqueo en el bloque sincronizado no es "justo". Esto significa que si hay 2 hilos en espera con la misma prioridad y el primer hilo esperó más que el segundo, eso no significa necesariamente que el primer hilo se ejecutará primero.

+0

¿Está diciendo que la prioridad más alta es lo primero? – Thilo

+0

no lo siento, no estoy diciendo eso, me perdí ese caso. Estoy diciendo que incluso un hilo con mayor prioridad podría ejecutarse después de un hilo con menor prioridad debido a la equidad. Esto se debe a que el bloqueo desleal proporciona garantías de vitalidad más débiles que requieren que todos los hilos finalmente adquieran el bloqueo. – punkers

4

Alguien más mencionó la disponibilidad de bloqueos justos. Si realmente te importa quién es el primero, entonces es posible que tengas un problema en tiempo real. En ese caso, puede hacer uso de RTSJ, donde se especifica el orden y la semántica de la adquisición de bloqueo. Los detalles están disponibles en RTSJ Spec bajo Sincronización. Citando de la sección razón de ser:

reglas de Java para código sincronizado proporcionan un medio para la exclusión mutua pero no impiden sin límites prioritarias inversiones y por lo tanto son insuficientes para aplicaciones en tiempo real. Esta especificación fortalece los semántica para código sincronizado por obligatoriedad de control de inversión de prioridades, en particular mediante el suministro de clases para la herencia de prioridad y la emulación techo prioridad . La prioridad es la más ampliamente implementada en sistemas operativos en tiempo real y por lo tanto es obligatorio y es el mecanismo predeterminado predeterminado en esta especificación .

Cuestiones relacionadas