[A] texto descifrado cuestiones extraña concurrencia de alta concurrencia primera detrás - la visibilidad del problema

EDITORIAL

Hielo grande: los zapatos de los niños platos de ayer para explicar el contenido de un refresco?

Guarniciones: Revisión, hermano mayor de hielo.

Hielo grande: Entonces dime ayer que hemos hablado de lo que?

Guarniciones: ayer hablaron de la dificultad de la programación concurrente extraído de estas dificultades tenemos que entender la causa de estos problemas "atrás". Para la programación concurrente, el ordenador y los fabricantes de sistemas operativos con el fin de mejorar el rendimiento de los equipos y sistemas, con el fin de aumentar el caché de la CPU, el sistema operativo aumenta los procesos y subprocesos, la CPU optimizado orden de ejecución de instrucciones. Estas medidas de optimización, precisamente, la causa de frecuentes programación concurrente extraño problema.

Gran Hielo: excelente, guarniciones zapatos, un buen conocimiento de hoy en día, vamos a hablar en profundidad los problemas de visibilidad causados ​​por la memoria caché, que es uno de los tres problemas de concurrencia "detrás", este conocimiento es muy importante, una buena escucha .

visibilidad

Por lo que es la visibilidad, la explicación más oficial es: modificar un hilo variable compartida, otro hilo se puede ver de inmediato.

Algunos dicen sin rodeos, es que dos hilos comparten una variable, no importa lo que uno modifica hilo de esta variable, a continuación, otro hilo se pueden ver en un hilo cambios en esta variable. Aquí variables compartidas, en referencia a los múltiples hilos pueden acceder y modificar el valor de esta variable, las variables a continuación, esta variable es compartida.

Por ejemplo, el hilo A y el hilo B, que son variables modifican directamente la memoria principal compartida, ya sea para modificar las variables compartidas hilo A, B o modificar el hilo variable compartida, otro hilo se lee de las principales variables de memoria valor, el valor debe ser modificado, esto es la visibilidad del hilo.

Aquí Insertar imagen Descripción

problemas de visibilidad

problemas de visibilidad pueden ser entendidas: las variables modifica un hilo compartidos, otros hilos no pueden ser vistos inmediatamente, que se añade por los problemas de caché CPU causadas.

Entender lo que es la visibilidad, vistazo a la visibilidad del problema que se entiende mejor. Dado que la visibilidad es uno modifica las variables compartidas de rosca más tarde, otro hilo puede ver inmediatamente los cambios en la variable compartida, si no se puede ver de inmediato, lo que tendrá un problema de visibilidad.

De un solo núcleo de CPU problema de la visibilidad no existe

Entender los problemas de visibilidad también tenemos que prestar atención al punto de que no hay ningún problema ** visibilidad en un solo núcleo de la CPU. ** ¿Por qué es esto?

Porque en un solo núcleo de la CPU, independientemente del número de procesos creados, sólo hay un hilo a la vez pueden obtener recursos de la CPU para realizar la tarea , incluso si la caché de la CPU de un solo núcleo se ha añadido. Estos hilos se están ejecutando en la misma CPU, el funcionamiento es el mismo caché de la CPU, variables, siempre y cuando uno de los hilos modifica el valor de la variable compartida, y que otro hilo podría no ser capaz de tener acceso para modificar el valor.

Aquí Insertar imagen Descripción

No es problema de la visibilidad de la CPU multi-core

CPU de un solo núcleo para el mismo tiempo no sólo será una ejecución hilo, y cada hilo, cuando se realiza la operación con un caché de la CPU, así que el problema de un solo núcleo CPU invisibilidad. Pero en la CPU de varios núcleos, no habrá problemas de visibilidad.

Esto se debe a la CPU de varios núcleos, cada núcleo de CPU tiene su propia caché. Cuando una pluralidad de diferentes hilos para funcionar en diferentes núcleos de CPU, estas operaciones son diferentes hilos caché de la CPU. Caché de un hilo en sus escrituras vinculados a la CPU para otro hilo, que no es necesariamente visible, lo que causó hilo problemas de visibilidad.

Aquí Insertar imagen Descripción

Por ejemplo, las cifras anteriores, ya que la CPU multi-núcleo, operación de caché es el hilo A en la CPU-01, hilo B es una operación de la memoria caché en la CPU-02, esta vez, de modificar el hilo Una variable hilo V B no es visible, y viceversa.

Java en el visibilidad del tema

Al escribir programas concurrentes utilizando el lenguaje Java, si las variables usos hilo copiar los datos en la memoria principal a la memoria privada hilo, es decir, la memoria de trabajo, cada hilo para leer y escribir datos, están operando su memoria de trabajo datos.

Aquí Insertar imagen Descripción

En este caso, el modelo de hilos de Java para leer y escribir variables compartidas con CPU de varios núcleos Del mismo modo, debido a los programas Java concurrentes que se ejecutan en la CPU de varios núcleos, la memoria privada hilo, la memoria de trabajo es el equivalente de una CPU de varios núcleos en la caché de cada núcleo de CPU a.

De la tabla anterior, sino que también se puede ver, para modificar el hilo variable compartida A y el hilo B puede no ser capaz de ver inmediatamente, lo que dará lugar a la cuestión de la visibilidad.

El código de ejemplo

Utilizamos un programa Java para verificar la visibilidad del problema de multi-hilo, en este programa, se define una variable miembro de tipo de cuenta larga, hay un nombre para el addCount método de este método para el valor de recuento se incrementa. Mientras tanto, en el método de ejecución, respectivamente, dos hilos de inicio, cada llamada al método addCount 1000, tras una espera de dos hilos está terminado, el valor de retorno de la cuenta, el código que se muestra a continuación.

package io.mykit.concurrent.lab01;

/**
 * @author binghe
 * @version 1.0.0
 * @description 测试可见性
 */
public class ThreadTest {

    private long count = 0;

    private void addCount(){
        count ++;
    }

    public long execute() throws InterruptedException {
        Thread threadA = new Thread(() -> {
            for(int i = 0; i < 1000; i++){
                addCount();
            }
        });

        Thread threadB = new Thread(() -> {
            for(int i = 0; i < 1000; i++){
                addCount();
            }
        });

        //启动线程
        threadA.start();
        threadB.start();

        //等待线程执行完成
        threadA.join();
        threadB.join();
        return count;
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadTest threadTest = new ThreadTest();
        long count = threadTest.execute();
        System.out.println(count);
    }
}

Corremos el programa, los resultados que se muestran en la figura.

Aquí Insertar imagen Descripción

Podemos ver el resultado de este programa es de 1509, no 2000 esperamos. ¿Por qué es esto? Vamos a analizar este programa.

En primer lugar, la variable count pertenecen las variables miembro de clase ThreadTest, variables miembro para el hilo A y el hilo B, es una variable compartida. hilo Supongamos que A y el hilo B se realizan simultáneamente, sino que también leen el count = 0 en la memoria de trabajo correspondiente, cada hilo después de la primera recuento ++ sido operación realizada mientras que el valor de recuento escrito a la memoria, esta vez, la memoria contar con valor de 1, 2 y no nuestra imaginación. En todo el proceso de cálculo, el hilo A y el hilo B se calculan en base a cada valor de recuento en la memoria de trabajo. Esto lleva a la cuenta final es inferior a 2000.

Después de todo: la visibilidad del problema se debe a la caché de la CPU.

resumen

La visibilidad es un hilo cambios en las variables compartidas, otro hilo puede ver de inmediato, si no se puede ver de inmediato, puede causar problemas de visibilidad. En un solo núcleo de la CPU no hay un problema de visibilidad, la visibilidad del problema existe principalmente en programas concurrentes que se ejecutan en la CPU de varios núcleos. En última instancia, la visibilidad del problema es causado por el caché de la CPU, la memoria caché y la visibilidad del problema es causado por uno de los "detrás" llevado a muchos problemas de programación concurrentes extraños. Sólo tenemos una profunda comprensión de los problemas de visibilidad causados ​​por la memoria caché, y siempre prestar atención a los problemas de visibilidad a evitar en el trabajo práctico, con el fin de preparar mejor las altas programas concurrentes.

Si cree que su artículo un poco de ayuda, búsqueda de micro-canales y sigue " la tecnología de hielo " número público de micro-canales, el aprendizaje de técnicas de programación de alto concurrentes con hielo.

fin

Hielo grande: Esta es hoy estamos hablando del primer "detrás" - problemas de visibilidad causados ​​por la memoria caché, guarniciones zapatos, productos secos conocimiento hoy hablamos son más propensos a escuchar de nuevo que no entiendo muy bien, hay que remontarse y cuidadosamente opinión ah!

guarniciones: Bueno, el hermano mayor de hielo. Hoy en día son mucho decir ah seco, vuelvo a Duokanjibian ah trabajo!

Por último, fije los conocimientos de programación concurrentes requeridos para dominar el mapa de conocimiento básico, deseo a todos en el aprendizaje de la programación concurrente, desvíos.
Aquí Insertar imagen Descripción

Liberadas 1338 artículos originales · ganado elogios 2277 · Vistas 5,29 millones +

Supongo que te gusta

Origin blog.csdn.net/l1028386804/article/details/105069270
Recomendado
Clasificación