Tres, multithreading java base del modelo de memoria de Java (JMM)

En primer lugar, las tres características multithreading

1. atomicidad: uno es decir, o más operaciones o todas las operaciones realizadas y el proceso no serán ejecución interrumpida de cualquier factor de, o no se realiza.

Un ejemplo clásico es el problema de transferencia de cuenta bancaria:
por ejemplo, la transferencia de la cuenta A a la cuenta B 1000 yuanes, debe incluir dos operaciones: menos 1.000 yuanes de la cuenta A, B a la cuenta más 1000 yuanes. Estas dos operaciones deben tener la atomicidad para asegurar que hay algunos problemas inesperados.

Nosotros también es cierto de datos de funcionamiento, tales como i = i + 1; incluyendo el valor de lectura de i, i se calcula, i escrito. Esta línea de código en Java no está disponible atómica, entonces no habrá problemas para ejecutar multi-hilo, por lo que también es necesario el uso de sincronización y bloquear estas cosas para asegurarse de que esta característica del.

De hecho, la atomicidad es garantizar la coherencia de datos, parte hilo de seguridad,

2. Visibilidad: Cuando varios subprocesos tienen acceso a la misma variable, un hilo cambia el valor de esta variable, otros hilos puede ver inmediatamente los valores modificados. Si dos hilos en diferentes CPU, luego enrosque 1 cambia el valor de i no modificó el hilo para refrescar la memoria principal, el hilo 2 y yo uso, es aún antes de que la afirmación del valor de i, el hilo 1 de las variables no vio esta es la visibilidad del problema.

3. Orden: la secuencia de la ejecución del programa realizado en el código de pedido. En procesador general con el fin de mejorar la eficiencia del proceso, que podría entrar en la optimización de código, que no garantiza la ejecución del programa en los estados individuales en el orden consistente con el orden del código, pero se asegurará de que la ejecución del programa final y los resultados de la secuencia de códigos el resultado es el mismo. De la siguiente manera:

int a = 10; // declaración 1

int r = 2; // declaración 2

a = a + 3; // declaración 3

r = a * a; // declaración 4

Debido a que la reordenación, podría orden de ejecución es 2-1-3-4,1-3-2-4
pero no es probable 2-1-4-3, porque rompe la dependencia.
Obviamente reordenación solo hilo no va a tener ningún problema, pero no necesariamente multi-hilo, por lo que tenemos que considerar esta cuestión en el momento de la programación multi-roscado.

Dos, el modelo de memoria de Java

1. modelo de memoria compartida se refiere al modelo de memoria de Java (en lo JMM), JMM decidió escribir un hilo a las variables compartidas, que se puede ver en otro hilo. Desde un punto de vista abstracto, JMM define una relación abstracta entre el hilo y la memoria principal: la memoria principal (memoria principal), cada hilo tiene una memoria local privada (memoria local) compartida entre hilos de almacenamiento variable de , la memoria local se almacena una copia de la rosca para leer / escribir variables compartidas. JMM memoria local es un concepto abstracto, y no son reales. Cubre la memoria caché, buffer de escritura, registros y otras optimizaciones de hardware y compilador.

2. Imagen

En la vista de mapa, entre los hilos A y B son como hilos puedan ser comunicados, debe pasar por los dos pasos siguientes:

2.1. En primer lugar, las variables compartidas hilo actualizada una memoria local de A a ser enviado a la memoria principal.

2.2. A continuación, el hilo B lee a la memoria principal antes de que el subproceso A ha actualizado la variable compartida.

3. Estos dos pasos se describirán a continuación por esquemática:

3.1. Como puede observarse, A y B tienen memoria local en la copia de la memoria principal de la variable x compartida. Suponiendo inicial, valores de x de estos tres memoria son 0. Un hilo, cuando se ejecuta, actualiza el valor de x (suponiendo un valor de 1) almacenada temporalmente en su propia memoria local en A. Cuando el hilo A y el hilo B requiere la comunicación, el hilo de un primer valor de x será el propietario de purgado a la memoria principal después de la modificación memoria local, el valor de x en este momento la memoria principal se convierte en la 1. Posteriormente, el hilo B a la memoria principal para leer el valor de x después de la actualización de hilo A, el valor de x en este momento la memoria local de la rosca B también se convierte en 1.

En general, estos dos pasos sustancialmente en el hilo de rosca A envía un mensaje a B, y el proceso de comunicación deben pasar por la memoria principal. JMM mediante el control de la interacción entre la memoria principal y la memoria local de cada hilo de rosca, para proporcionar visibilidad de garantía memoria programador de Java.

4. Resumen

¿Cuál es J AVA modelo de memoria: la Java modelo de memoria referido como el JMM , conjunto define un hilo a otro hilo visible. Compartidos variables almacenadas en la memoria principal, cada hilo tiene su propio local de la memoria, como cuando varios subprocesos tienen acceso a un dato puntual podría no refrescar la memoria local a la memoria principal, por lo que el hilo ocurrirá seguridad cuestiones.

En tercer lugar, lo que es volátil

Después de que el valor de 1. En otras palabras, una vez que la visibilidad de un modifica hilo de la variable modificada es volátil, se asegurará de que los valores modificados se actualizan inmediatamente a la memoria principal, cuando hay otros temas necesitan leer, se puede obtener de forma inmediata modificar .

2. En Java con el fin de acelerar la eficiencia del programa, el funcionamiento de algunas de las variables se realiza generalmente en los registros de rosca o CPU caché, sólo después sincronizado a la memoria principal, y añadir el modificador volátil es variable se lee directamente y escribir la memoria principal.

3.Volatile garantizar la visibilidad oportuna de las variables compartidas entre los hilos, pero no puede garantizar la atomicidad.

class ThreadVolatileDemo extends Thread {
    public  volatile  boolean flag = true;
    @Override
    public void run() {
        System.out.println("开始执行子线程....");
        while (flag) {
        }
        System.out.println("线程停止");
    }
    public void setRuning(boolean flag) {
        this.flag = flag;
    }
}
public class ThreadVolatile {
    public static void main(String[] args) throws InterruptedException {
        ThreadVolatileDemo threadVolatileDemo = new ThreadVolatileDemo();
        threadVolatileDemo.start();
        Thread.sleep(3000);
        threadVolatileDemo.setRuning(false);
        System.out.println("flag 已经设置成false");
        Thread.sleep(1000);
        System.out.println(threadVolatileDemo.flag);
    }
}

4. resultados

4.1. Los resultados (más volátil)

开始执行子线程....
flag 已经设置成false
线程停止
false开始执行子线程....
flag 已经设置成false
线程停止
false

4.2 Los resultados (sin volátil, el resultado ha sido también conjunto fasle Por qué ejecutarlo ?. Motivo: entre el hilo no es visible, leer una copia, no hay tiempo para leer los resultados de una solución a la memoria principal para su uso. cuando la palabra clave volátil va a resolver la visibilidad entre los hilos, cada hilo se ve obligado a leer el valor de todo el valor "memoria principal" )

开始执行子线程....
flag 已经设置成false
false

Cuatro, volátil y sincronizada diferencia

1. por lo que podemos ver que a pesar de tener volátil atómico pero no lo hace la visibilidad de garantía.

2. Rendimiento, palabra clave sincronizada para evitar que varios subprocesos para ejecutar una pieza de código, que afectará a la eficacia de la ejecución del programa y la palabra clave volátil en algunos casos mejor rendimiento que sincroniza.

3. Pero ser la palabra clave volátil cuidado no es un sustituto para la palabra clave sincronizada, por la palabra clave volátil no puede garantizar operaciones atómicas.

En quinto lugar, el final de la

1. Siempre mantener la fe !!!

Publicados 122 artículos originales · ganado elogios 64 · Vistas a 50000 +

Supongo que te gusta

Origin blog.csdn.net/chenmingxu438521/article/details/103764641
Recomendado
Clasificación