volátil se puede garantizar la atomicidad que?

No se puede volátil garantiza la atomicidad.
Cuando el auto-operativo junto con el aumento, la operación en sí no es operación de incremento atómica.

class Data {
    public volatile int number;
    public void add(){
        number++;
    }
}
public class Main {
    public static void main(String[] args) {
        Data data = new Data();
        for (int i=0; i<10; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i=0; i<2000; i++) {
                        data.add();
                    }
                }
            }, String.valueOf(i)).start();
        }
        while (Thread.activeCount() >=2) {
            Thread.yield();
        }
        System.out.println(data.number);
    }
}

número de salida no es 20.000.
No es que hay una falta de comprensión de, volátil asegura la visibilidad de palabras clave no está mal, pero mal en el procedimiento anterior no puede garantizar la atomicidad. Visibilidad sólo se garantiza que cada lectura es el valor actual, pero no hay manera de garantizar las operaciones atómicas volátiles en las variables.
  En el ya mencionado, no tenemos la operación de auto-energizante es atómico, que comprenden las variables leídas valor original, se incrementan, la operación de escritura de memoria . Entonces ese operador de incremento de tres sub-operaciones se pueden dividir ejecutado, que puede conducir a la situación se produce siguiente:

Si un inc tiempo variable es de 10,

Tema 1 de variables de operación de la subasta, el hilo 1 lee primero el valor de la variable original inc, luego pase 1 es bloqueado;

A continuación, el hilo 2 para las variables operador de incremento, hilo 2 también para leer el valor original del inc variables, debido a la variable de subproceso inc 1 operación acaba de leer, pero no modificó el funcionamiento de las variables, por lo que no causa el subproceso de trabajo 2 la memoria de variables inc caché sin efecto una línea de caché, el hilo irá directamente a la memoria principal 2 para leer el valor de inc, inc encontró el valor 10, y luego se incrementa, y la escritura en la memoria de trabajo 11, y finalmente en la memoria principal .

Pase 1, posteriormente, se incrementa, ya que el valor ha sido leído inc, nota que este caso se encuentra en la memoria de trabajo 11 en el hilo 1 es el valor de inc es todavía 10, así que después de un par de hilo se incrementan inc inc y y luego escribir la memoria de trabajo 11, y finalmente en la memoria principal.

Luego, dos hilos se llevaron a cabo una vez desde el operador de incremento, inc aumentó sólo 1. volver escrito a problemas de sobreescritura de memoria principal.

Explicar aquí, puede tener un amigo esté en duda, no, ah, no se modifica una garantía frente a una variable en una variable volátil, puede cachear línea no es válida? A continuación, otro hilo para leer leerá el nuevo valor de este derecho. Esta es una reglas variables volátiles por encima sucede-antes de reglas, pero nota que la variable hilo 1 después de una operación de lectura, fue bloqueado, no modifica el inc valor. Aunque volátil y puede garantizar el valor de la lectura variable de subproceso 2 inc se lee de la memoria, pero no modifica el hilo 1, el hilo 2 no ver los cambios de valor.

Arraigada aquí, operación de incremento no es operaciones atómicas, pero no puede garantizar que todas las variables operativas volátiles son atómicos.

Reproducido dirección: https: //my.oschina.net/134596/blog/3039654

Publicado 59 artículos originales · alabanza ganado 15 · vistas 558

Supongo que te gusta

Origin blog.csdn.net/qq_45287265/article/details/105054775
Recomendado
Clasificación