[Descifrado] resulta en problemas de concurrencia alta concurrencia detrás de la segunda - problema atomicidad (termina el texto tiene beneficios)

EDITORIAL

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

Guarniciones: hermano revisado hielo grande, el contenido completo de ayer de ah seco, me siento una gran cosecha.

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

Los platos de lado: sobre todo acerca de la visibilidad del tema y la visibilidad del hilo de ayer. La visibilidad se refiere a una modificación de la rosca variable compartida, otro hilo puede ver inmediatamente, 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.

Gran Hielo: excelente, guarniciones zapatos, una buena crítica, y hoy, nos siguen hablando de los problemas de concurrencia segundo "detrás" - atomicidad problemas causados ​​por el cambio de subproceso, este conocimiento es muy importante, sin duda, mejor que agradable .

Nota: El final del artículo hay beneficios! ! !

atomicidad

La atomicidad se refiere al comportamiento del proceso de una o más operaciones realizadas por la CPU no se interrumpe. operación atómica después de que comience a funcionar, pondrá en funcionamiento hasta el final de la mitad habrá produce ninguna interrupción.

También podemos interpretar de esta manera la atomicidad, es el hilo mientras se realiza una serie de operaciones que se ejecutarán en su conjunto no puede ser dividida, estas operaciones están bien todos ejecutan o no de todo, no es sólo una parte de la aplicación del caso, esta es la operación atómica.

operaciones atómicas sobre un escenario típico es la transferencia , por ejemplo, el equilibrio Bob y Xiaogang cuenta es de $ 200, esta vez simplemente pequeña transferencia a Bob 100, si la transferencia se realiza correctamente, el saldo de la cuenta Xiaoming $ 100, Xiaogang el saldo de la cuenta de 300 yuanes, si falla la transferencia, saldo de la cuenta Xiao Ming y de Xiao Gang, sigue siendo de $ 200. Bob no da cuenta de la presencia de 100, 200 yuanes cuenta Xiaogang o cuentas para Bob 200, 300 yuanes representan caso Xiaogang.

Aquí, Xiaoming Xiaogang para transferir $ 100 operación es una operación atómica, lo que implica reducir Xiaoming saldo de la cuenta 100, Xiaogang saldo de la cuenta de $ 100 para aumentar la operación, estas dos operaciones son un todo integral, o bien todos ejecutan o no todos.

Xiaogang transferencia exitosa a Bob, como se muestra en la siguiente.

Aquí Insertar imagen Descripción

transferencia Xiaogang a Bob falla, como se muestra a continuación.

Aquí Insertar imagen Descripción

Xiao Ming no dará cuenta de los $ 100, $ 200 Xiaogang cuenta de la situación.

Aquí Insertar imagen DescripciónNo aparecerá Xiao Ming cuentas de 200 yuanes, 300 yuanes cuenta Xiaogang de la situación.

Aquí Insertar imagen Descripción

conmutación hilo

En la programación concurrente, a menudo el ajuste del número de hilos será mayor que el número de CPU, y cada CPU sólo puede utilizar un hilo a la vez. La asignación de recursos de la CPU utilizando una estrategia por turnos, que se asigna un segmento de tiempo a cada hilo, el hilo ocupan recursos de la CPU durante este intervalo de tiempo para realizar la tarea. Cuando los recursos de CPU de la rosca ejecución de la tarea, dejar que los recursos de la CPU para otros hilos de ejecución, esta es la tarea de conmutación, también conocido como el cambio de contexto o de conmutación hilo hilo.

Si todavía no entiende las palabras, podemos usar la siguiente tabla para simular el hilo en la CPU del proceso de conmutación.

Aquí Insertar imagen Descripción

Enhebrar una y el hilo B presente dos hilos en los dibujos, cada pequeño cuadrado representa hilo A y el hilo B en este caso hilo posee los recursos de la CPU y tareas realiza, el tiempo ocupado por un pequeño cuadrado, se llama un segmento de tiempo, en este intervalo de tiempo, el hilo ocupan recursos de la CPU se ejecutan en la CPU, recursos de CPU desocupada hilo no será ejecutado en la CPU. Y cada línea de puntos representa el hilo en este momento no ocupan recursos de la CPU. CPU frecuencia conmuta entre el hilo A y el hilo B.

preguntas atómicas

Entender lo que es atómica, vistazo a lo que es el tema atómico es relativamente simple.

La atomicidad se refiere a un problema de proceso o una pluralidad de operaciones realizadas por la CPU en el caso en el que se produjo la interrupción.

Discussion mientras se realiza una operación en este momento si se produce el cambio de subproceso de CPU, gire la CPU para realizar otras tareas, la interrupción de la operación del hilo de ejecución actual, que dará lugar a problemas atómicas.

Si no puede entenderlo, vamos a darle un ejemplo: Supongamos que la línea de realizar transacciones comerciales en el banco, Xiao Ming pasar por completo dueño de Xiao Ming delante de usted, contador empleado, acabe de ser descargado a que, en este momento el trabajo del banco, y el contador el secretario sonrió y le dijo: realmente lo siento, Sr. (ms), que salía del trabajo, se llega mañana de vuelta! En este punto usted es igual que un hilo ocupan recursos de la CPU, mientras que se hunde se produjo el empleado del mostrador en el cambio de subproceso de CPU, que cambiará las discusiones a este hilo del trabajo, del trabajo a realizar la operación salió.

Aquí Insertar imagen Descripción

átomos de Java en cuestión

En Java, el programa concurrente se basa en la tecnología multi-threading para escribir, lo que también implica el problema de la conmutación para el hilo de la CPU, que es la CPU del mecanismo de conmutación de tareas, lo que lleva a la programación concurrente aparecerá pregunta extraña atómica, las cuestiones atómicas, se ha convertido en los problemas de concurrencia segunda causa "detrás".

En la programación concurrente, el lenguaje Java es a menudo una simple declaración, corresponderá a una pluralidad de instrucciones de la CPU, en el supuesto de que el código se escribe clase ThreadTest como se muestra a continuación.

package io.mykit.concurrent.lab01;

/**
 * @author binghe
 * @version 1.0.0
 * @description 测试原子性
 */
public class ThreadTest {

    private Long count;

    public Long getCount(){
        return count;
    }

    public void incrementCount(){
        count++;
    }
}

A continuación, abra el archivo de clase de la clase directorio ThreadTest se encuentra, entre el mandato siguiente en la línea de comando cmd.

javap -c ThreadTest

A raíz de los resultados obtenidos, como se muestra a continuación.

d:>javap -c ThreadTest
Compiled from "ThreadTest.java"
public class io.mykit.concurrent.lab01.ThreadTest {
  public io.mykit.concurrent.lab01.ThreadTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public java.lang.Long getCount();
    Code:
       0: aload_0
       1: getfield      #2                  // Field count:Ljava/lang/Long;
       4: areturn

  public void incrementCount();
    Code:
       0: aload_0
       1: getfield      #2                  // Field count:Ljava/lang/Long;
       4: astore_1
       5: aload_0
       6: aload_0
       7: getfield      #2                  // Field count:Ljava/lang/Long;
      10: invokevirtual #3                  // Method java/lang/Long.longValue:()J
      13: lconst_1
      14: ladd
      15: invokestatic  #4                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      18: dup_x1
      19: putfield      #2                  // Field count:Ljava/lang/Long;
      22: astore_2
      23: aload_1
      24: pop
      25: return
}

Aquí, nos centramos en las instrucciones incrementCount CPU correspondientes al método, como se muestra en ().

public void incrementCount();
    Code:
       0: aload_0
       1: getfield      #2                  // Field count:Ljava/lang/Long;
       4: astore_1
       5: aload_0
       6: aload_0
       7: getfield      #2                  // Field count:Ljava/lang/Long;
      10: invokevirtual #3                  // Method java/lang/Long.longValue:()J
      13: lconst_1
      14: ladd
      15: invokestatic  #4                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      18: dup_x1
      19: putfield      #2                  // Field count:Ljava/lang/Long;
      22: astore_2
      23: aload_1
      24: pop
      25: return

Se puede ver, en lenguaje Java sólo unas pocas líneas método incrementCount () corresponden en realidad a tantas instrucciones de la CPU. Estas instrucciones de la CPU que se puede dividir en tres pasos.

  • Instrucción 1: la variable contador se carga desde la memoria registros de la CPU.
  • Instrucción 2: ejecutar la operación en el recuento de registro ++.
  • Instrucción 3: Los resultados de la caché de escritura (caché de la CPU puede ser, puede ser un recuerdo).

Cuando pueda ocurrir el sistema operativo para llevar a cabo la conmutación hilo después de que se complete cualquier instrucción de la CPU, en lugar de que se complete una sentencia del programa. Si el hilo está ejecutando la instrucción A 1, un interruptor de hilo se produce el sistema operativo, cuando los dos hilos están realizando recuento ++ operación, el resultado es uno en lugar de dos. Aquí, podemos usar el siguiente diagrama para representar este proceso.

Aquí Insertar imagen Descripción

De la tabla anterior, podemos ver: una densidad de hilos = 0 se carga en los registros de la CPU, el interruptor de hilo se produce. En este momento, el valor de recuento de la memoria sigue siendo 0, el hilo B = 0 conteo cargado en un registro, cuentan de realizar operaciones, ++, y count = 1 se escribe en la memoria. En este momento, el interruptor de CPU A a la rosca, el hilo A se ejecutan en el recuento de operación ++, el valor de recuento de hilo A 1, A = número de hilos 1 se escribe en la memoria, entonces el valor de conteo final como una memoria.

Por lo tanto, si hay un hilo que se ejecuta en la CPU, la CPU justo en este momento se produce un cambio de hilo, que puede conducir a problemas atómicas, lo que también contribuyó a una de las causas fundamentales de los problemas frecuentes de la programación concurrente . Sólo tenemos que entender y comprender la atomicidad atomicidad hilo y las causas profundas del problema, y siempre prestar atención a la existencia de programas concurrentes escritos en cuestiones atómicas, con el fin de mejor escribir programas concurrentes en su trabajo diario.

resumen

problemas de visibilidad causados por el almacenamiento en caché, hilo de cambiar el orden de llevar Atómica y problemas de optimización del compilador provocados, dando lugar a tres fuentes programación concurrente extraño problema se produce con frecuencia , hemos introducido la visibilidad causada por la caché preguntas y problemas causados interruptor de hilo de atomicidad. A continuación, seguir cultivando el orden de los problemas de alta concurrencia.

Escrito en los últimos

Hielo de gran tamaño: Bueno, estamos hablando de hoy es el contenido principal, el contenido de hoy también es más importante, volver a una buena crítica.

guarniciones: Bueno, el hermano mayor de hielo, alguna buena crítica.

El final de la frase, el bienestar

Búsqueda de micro-canales y siga " la tecnología de hielo " número público de micro-canales, envío de " JVM " para recibir un conjunto completo de "manual de instrucciones JVM."

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 1339 artículos originales · ganado elogios 2285 · Vistas 5.3 millones +

Supongo que te gusta

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