Java LockSupport memoria consistencia
-
21-09-2019 - |
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.
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 subsecuenteunpark()
hará que sea más listo. Un perfectamente legal, pero de baja calidad implementación depark()
yunpark()
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 usopark()
-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.