La comprensión-dad atómica, la visibilidad y la reordenación de los bloques sincronizado vs las variables volátiles en Java

juega:

Estoy tratando de comprender volatilela palabra clave del libro de Java concurrencia en la práctica. I compara synchronizedpalabras clave con volatilelas variables en tres aspectos:-dad atómica, la volatilidad y de reordenamiento. Tengo algunas dudas sobre la misma. Los he discutido uno por uno a continuación:

1) Visibilidad: `` synchronized` vs volatile`

Libro dice lo siguiente con respecto a la visibilidad de synchronized:

Hilo de Todo Ahizo en o antes de un bloque sincronizado es visible para Bcuando se ejecuta un bloque sincronizado vigilado por la misma cerradura.

Se dice lo siguiente con respecto a la visibilidad de volatilelas variables:

Las variables volátiles no se almacenan en caché en los registros o en las memorias caché donde se ocultan de otros procesadores, por lo que una lectura de una variable volátil siempre devuelve la escritura más reciente de cualquier tema.
Los efectos de visibilidad de las variables volátiles se extienden más allá del valor de la propia variable de volátil. Cuando el hilo A escrituras en una variable volátil y posteriormente hilo B lee esa misma variable, los valores de todas las variables que eran visibles a A antes de escribir a la variable volátil se hacen visibles a B después de leer la variable volátil. Por lo tanto, desde una perspectiva visibilidad de memoria, escribiendo una variable volátil es como salir de un bloque sincronizado y la lectura de una variable volátil es como entrar en un bloque sincronizado.

Q1. Siento segundo párrafo anterior (de volatile) corresponde a lo que dijo sobre el libro synchronized. Pero, ¿existe synchronized-equivalente a volatilepunto 's en primer lugar? En otras palabras, no usando synchronizedgarantiza que cualquier / algunas variables no conseguir en caché en memorias caché del procesador y los registros?

Tenga en cuenta que el libro también dice siguiente acerca de la visibilidad para synchronized:

Bloqueo no se trata sólo de exclusión mutua; también se trata de la visibilidad de memoria.

2) Reordenamiento: `synchornized` vs` volatile`

Libro dice acerca siguiente volatileen el contexto de la reordenación de:

Cuando se declara un campo volatile, el compilador y el tiempo de ejecución se ponen sobre aviso de que esta variable es compartida y que las operaciones en que no deben ser reordenados con otras operaciones de memoria.

Q2. Libro no dice nada sobre la reordenación en el contexto de synchronized. ¿Puede alguien explicar lo que se puede decir de reordenamiento en el contexto de synchronized?

3) La atomicidad

Libro dice siguiente acerca de la atomicidad synchronizedy volatile.

la semántica de volátiles no son suficientes para hacer que la operación de incremento fuerte ( count++) atómica, a menos que pueda garantizar que la variable se escribe sólo de un único hilo.

El bloqueo puede garantizar tanto la visibilidad y la atomicidad; las variables volátiles sólo pueden garantizar la visibilidad.

Q3. Supongo que esto significa dos hilos pueden ver volatile int ajuntos, ambos se incrementará y luego guardarlo. Sin embargo, sólo una última lectura tendrá efecto, con lo que todo el "lectura de la subasta-Guardar" no atómica. Estoy en lo correcto con esta interpretación en la no-atómica-ción de volatile?

Q4. Hace todo bloqueo equivalente son comparables y tienen visibilidad mismos, propiedad de ordenación y atomicidad: sincronizada bloques, las variables atómicas, cerraduras?

PD: Esta pregunta se relaciona con y completamente renovada versión de esta pregunta que hice algunos días atrás. Desde su completa renovación, no he eliminado el más viejo. Escribí esta cuestión de una manera más centrado y estructurado. Se eliminarán una vez que consigo más viejo respuesta a esta pregunta.

rzwitserloot:

La diferencia clave entre 'sincronizado' y 'volátil', es que 'sincronizado' puede hacer que los hilos de pausa, mientras que lata volátil no.

'Cachés y registros' no es una cosa. El libro dice que debido a que en la práctica eso es por lo general cómo se implementan las cosas, y lo hace más fácil (o tal vez no, teniendo en cuenta estas preguntas) para entender el cómo y por qué de la JMM (modelo de memoria de Java).

El JMM no nombra a ellos, sin embargo. Lo único que dice es que la máquina virtual es libre de dar a cada hilo de su propia copia local de cualquier variable, o no, estar sincronizados en algún momento arbitrario con algunos o todos los otros hilos, o no ... a menos que hay una sucede antes relación en cualquier lugar, en cuyo caso el VM debe garantizar que en el punto de ejecución entre los dos hilos donde un sucede antes se ha establecido la relación, que observan todas las variables en el mismo estado.

En la práctica eso significa, presumiblemente, a ras cachés. O no; que podría significar el otro hilo sobrescribe su copia local.

La máquina virtual es libre de implementar estas cosas sin embargo que quiere, y de manera diferente en cada arquitectura que hay. Mientras los palos de VM a los garantizados que el JMM marcas, es una aplicación buena, y como consecuencia, el software debe trabajar dada únicamente las garantías y no hay otros supuestos; porque lo que funciona en su máquina podría no funcionar en otro si se basan en suposiciones que no están garantizados por el JMM.

reordenando

También reordenamiento no está en la especificación de máquina virtual, en absoluto. ¿Qué hay en la especificación de máquina virtual son los siguientes dos conceptos:

  1. Dentro de los confines de un solo hilo, todo lo que se puede observar desde su interior es consistente con una vista ordenada. Es decir, si se escribe 'x = 5; y = 10;' no es posible observar, desde dentro del mismo hilo, siendo ser y 10 pero x su antiguo valor. Independientemente de sincronizado o volátil. Por lo tanto, en cualquier momento se puede cambiar el orden de las cosas sin que eso sea observable , entonces la máquina virtual es libre. ¿Lo hará? Hasta la máquina virtual. Algunos lo hacen, otros no.

  2. Al observar los efectos causados por otros hilos, y no se ha establecido una relación sucede-antes, es posible ver algunos, todos o ninguno de estos efectos, en cualquier orden. En realidad, cualquier cosa puede suceder aquí. En la práctica, entonces: No trate de observar los efectos causados por otros hilos sin establecer un pasa-antes, porque los resultados son arbitrarias y no comprobable .

Ocurre antes relaciones se establecen por todo tipo de cosas; bloques sincronizados obviamente lo hacen (si el hilo se congela tratando de obtener un bloqueo, y posteriormente ejecuta, cualquier bloque sincronizado con el objeto que acabada 'pasado antes', y cualquier cosa que hicieran ahora se puede observar, con la garantía de que lo que observamos es consistente con aquellas cosas que hayan recorrido en orden, y donde todos los datos que escribieron se puede ver (como en, usted no conseguirá un 'caché' o lo que sea mayor). accesos volátiles también lo hacen.

Atomicidad

Sí, su interpretación de por qué x ++ no es atómica, incluso si x es volátil, es correcta.

No estoy seguro de lo que su Q4 está tratando de preguntar.

En general, si quieres incrementar atómicamente un entero, o hacer cualquiera de muchas otras operaciones concurrentes-esque, mirada en el java.util.concurrentpaquete. Estos contienen implementaciones eficientes y útiles de diversos conceptos. AtomicInteger , por ejemplo, se puede utilizar para algo atómicamente incremento, de una manera que es visible desde otros hilos, sin dejar de ser bastante eficiente (por ejemplo, si los soportes de CPU operaciones (CAS) y-Set-compare, Atomicinteger va a usar ; no es algo que se puede hacer desde java general sin recurrir a Unsafe).

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=385820&siteId=1
Recomendado
Clasificación