tipos ejemplos declarar java multithreading synchronization thread-safety volatile

ejemplos - declarar variables en java netbeans



¿Las variables de Java en sí mismas son seguras? Al actualizar las variables? (3)

Consulte la clase AtomicInteger y el tutorial de java en los hilos para ver ejemplos. También el javadoc.

https://docs.oracle.com/javase/tutorial/essential/concurrency/

Esta pregunta ya tiene una respuesta aquí:

Supongamos que tengo dos hilos actualizando un objeto, y un hilo leyendo de ese objeto sin sincronización. Obviamente, esto es condición de ejecución. Sin embargo, me pregunto si la variable en sí solo puede escribirse parcialmente.

public class CommonObject extends Object { static int memberVar=-1; } public class Input1Thread extends Thread { public void run() { while(true) CommonObject.memberVar = 1 } } public class Input2Thread extends Thread { public void run() { while(true) CommonObject.memberVar = 2; } } public class OutputThread extends Thread { public void run() { while(true) System.out.println("CommonObject.memberVar"+ CommonObject.memberVar); } }

Supongo que el valor impreso también será 2 o 1. Sin embargo, me preguntaba si era posible que la variable estuviera a medio camino.

Usé primitivos como ejemplo, pero me gustaría que la respuesta también se aplicara a los objetos, si es diferente.


Depende del tipo de la variable.

double s y long s (los dos tipos de 64 bits en Java) pueden desviarse si no son volatile , mientras que el resto de los tipos (incluidas las referencias) pueden no romperse nunca. El desgarro de palabras le daría el comportamiento que le preocupa: algunos de los bytes son del valor anterior, algunos de ellos son del nuevo valor y el resultado general es un valor que no es antiguo ni nuevo.

Esto se especifica en JLS 17.7 :

A los efectos del modelo de memoria del lenguaje de programación Java, una sola escritura en un valor largo o doble no volátil se trata como dos escrituras separadas: una para cada mitad de 32 bits. Esto puede dar como resultado una situación en la que un hilo ve los primeros 32 bits de un valor de 64 bits de una escritura, y los segundos 32 bits de otra escritura.

Las escrituras y lecturas de valores volátiles largos y dobles siempre son atómicos.

Las escrituras y lecturas de referencias son siempre atómicas, independientemente de si están implementadas como valores de 32 bits o de 64 bits.

Por supuesto, la introducción de carreras de datos presenta una gran cantidad de problemas; pero su pregunta estaba específicamente dirigida a la pérdida de palabras, así que solo me refiero a eso aquí, excepto para señalar que "solo porque puede, no significa que deba hacerlo". Debe tener cuidado de analizar cada raza de datos que tenga y probar que es benigna (como algunos de ellos, como el almacenamiento en caché de sus valores por parte de String.hashCode).


Es seguro para primitivos pero no es seguro para objetos. Por ejemplo, el objeto A tiene dos variables int a, b, si intenta cambiar sus valores en dos subprocesos diferentes, encontrará que los valores de ambos subprocesos pueden aparecer al mismo tiempo algunas veces .