Orden de lanzamiento sincronizado

Escaneé todo el Java documentación al synchronized declaraciones en busca de una respuesta a esta pregunta sin suerte.

Di que tengo thread1, thread2, thread3 tratando de ejecutar el siguiente código al mismo tiempo.

 synchronized(lockObj) { 
     doSomething();
 }

Asumir thread1 llega primero a doSomething(), thread2 luego thread3 que bloqueará y esperará en el synchronized .

Pregunta

  1. En el momento en que thread1 libera el bloqueo, ¿cuál de los subprocesos se liberará primero?
  2. ¿Cuál es la regla de orden general que se aplica al liberar un candado?

preguntado el 30 de junio de 12 a las 17:06

¿Por qué no usar simplemente una BlockingQueue como una ArrayBlockingQueue ¿o algo similar? O no entiendo tu pregunta. -

Lo resumiría en un solo término: los subprocesos que esperan en un monitor se alistan en una espera planificadas. -

@HovercraftFullOfEels Mi confusión realmente comenzó después de leer este código tutorialspoint.com/java/java_thread_synchronization.htm Siempre he pensado que las cerraduras se administran de forma FIFO, pero aparentemente no.

1 Respuestas

1. Hilo2 o hilo3. No hay garantía:

Del mismo modo, no se deben hacer suposiciones sobre el orden en que se otorga a los subprocesos la propiedad de un monitor o el orden en que se activan los subprocesos en respuesta al método de notificación o notificación a todos.

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/thread-priorities.html#general

2. Los monitores de Java (sincronizados/en espera/notificar/notificar a todos) no son justos. Las primitivas de sincronización de Java 1.5 generalmente tienen parámetros para hacer cumplir la equidad. Tenga en cuenta que la versión justa tiene una penalización de rendimiento considerable, por lo general, se debe usar la versión no justa: estadísticamente, cada subproceso tendrá la oportunidad de ejecutarse, incluso si el orden no se cumple estrictamente.

Los programas que usan bloqueos justos a los que acceden muchos subprocesos pueden mostrar un rendimiento general más bajo (es decir, son más lentos; a menudo mucho más lentos) que los que usan la configuración predeterminada, pero tienen variaciones menores en los tiempos para obtener bloqueos y garantizar la ausencia de inanición. Tenga en cuenta, sin embargo, que la imparcialidad de los bloqueos no garantiza la imparcialidad de la programación de subprocesos. Por lo tanto, uno de los muchos subprocesos que utilizan un bloqueo justo puede obtenerlo varias veces seguidas, mientras que otros subprocesos activos no progresan y actualmente no mantienen el bloqueo. También tenga en cuenta que el método tryLock sin tiempo no respeta la configuración de imparcialidad. Tendrá éxito si el bloqueo está disponible incluso si hay otros subprocesos esperando.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html#ReentrantLock%28boolean%29

Respondido el 30 de junio de 12 a las 17:06

hmm, sabía que no había garantías con subprocesos, pero siempre imaginé que la cola de bloqueo sería, ya sabes, cola, con fifo y todo eso. Buena respuesta. - Denis Tulsky

@DenisTulskiy El JLS nunca menciona una cola, sino un conjunto. Eso lo dice todo! - Marko Topolnik

@MarkoTopolnik: tal vez sea porque cuando tomé mi clase de sistema operativo, la estábamos implementando como una cola. - Denis Tulsky

@DenisTulskiy Implementarlo como una cola es definitivamente el enfoque más obvio e instructivo. Y tenga en cuenta que solo estoy hablando en el nivel de especificación: las implementaciones reales bien pueden estar usando una cola, pero es importante que el JLS no lo haga. garantizar una fila. - Marko Topolnik

@MarkoTopolnik: bueno, no garantizar que haya más espacio para optimizaciones y demás, sin dificultar el enhebrado. parece una decisión lógica. - Denis Tulsky

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.