Pregunta

Java 6 pregunta API. Tiene LockSupport.unpark(thread) llamar a un sucede antes relación con el regreso de LockSupport.park en el hilo justo no aparcado? Sospecho fuertemente la respuesta es sí, pero no parece el Javadoc mencionar explícitamente.

¿Fue útil?

Solución

He mirado pesar de que el código de JDK y parece que los métodos LockSupport son normalmente llamados fuera de los bloques de sincronización. Por lo tanto, su suposición parece ser correcta.

Otros consejos

Yo sólo he encontrado esta pregunta porque me preguntaba lo mismo. Según este artículo por Oracle investigador David dados , la respuesta parece ser no . Aquí está la parte pertinente del artículo:

  

Si un hilo se bloquea en park() que tiene la garantía de que un subsecuente   unpark() hará que sea más listo. Un perfectamente legal, pero de baja calidad   implementación de park() y unpark() sería métodos vacíos, en los cuales   el programa degenera a hilar sencilla. Una de hecho, ese es el   prueba de fuego para uso park()-unpark() correcta.

métodos park() y unpark() vacíos no le dan ninguna sucede antes garantías de relación, por lo que para su programa sea 100% portátil, usted no debe confiar en ellos.

Por otra parte, Javadoc de la LockSupport dice:

  

Estos métodos están diseñados para ser utilizados como herramientas para crear   utilidades de sincronización de mayor nivel, y no son en sí mismos   útil para la mayoría de aplicaciones de control de concurrencia. El método park es   diseñado para su uso sólo en construcciones de la forma:

     

while (!canProceed()) { ... LockSupport.park(this); }

Ya que tienes que comprobar explícitamente alguna condición de todos modos, que, o bien incluir volatile o las variables correctamente sincronizados, las garantías débiles de park() no deberían ser en realidad un problema, ¿verdad?

Si no está documentado como tal, entonces no se puede confiar en ella antes de la creación de una relación sucede.

En concreto LockSupport.java en hotspot código simplemente llama Unsafe.park y .unpark!

El sucede antes relación generalmente provienen de un par de lectura-escritura de un indicador de estado volátil o algo similar.

Recuerde, si no se documenta como la creación de un sucede antes relación, entonces debe tratarlo como si no, incluso si usted puede probar que lo hace en su sistema específico. Los futuros sistemas e implementaciones no. Dejaron a sí mismos de que la libertad por una buena razón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top