Finalización de puntos de conocimiento concurrentes

Concurrente

Atomicidad, visibilidad, orden.

1) Atomicidad: El funcionamiento de la variable atómica del modelo de memoria
2) Visibilidad: Debido a que en el proceso de ejecución, cada hilo tiene su propio espacio de memoria separado, solo a través (volátil, sincronizado, final) se pueden ingresar nuevos valores inmediatamente en el memoria principal
3) Orden: orden dentro de los hilos, desorden entre hilos. Aprobado, principio de primera aparición y, volátil, sincronizado

Dos procesos de tres estados

Proceso de transición de tres estados
1)
Estado de ejecución -> estado de bloqueo: el proceso en ejecución entra en el estado de bloqueo estado de
ejecución -> estado listo: el intervalo de tiempo asignado a cada proceso es limitado y el intervalo de tiempo de ejecución se utiliza por completo.Después de eso, o aparece un proceso de mayor prioridad, entra en el estado listo. Estado
listo -> estado en ejecución: programado por la CPU, seleccione un proceso para asignar un intervalo de tiempo para la ejecución.
Estado de bloqueo -> estado en ejecución: el evento que espera el proceso ha ocurrido

Tres estados en el hilo de JVM

El estado en el hilo de jvm

  1. Creación de hilo
  2. El hilo está en un estado ejecutable
  3. Cuando el subproceso no ha obtenido el objeto de bloqueo, el subproceso ingresa al bloque de bloqueo, espera adquirir el objeto de bloqueo y entra en el estado ejecutable
  4. El subproceso adquiere el objeto de bloqueo, pero llama al método wait (), entra en la espera inalámbrica y espera a que otros subprocesos llamen a notificar (). Solo cuando se adquiere el objeto de bloqueo, puede entrar en el estado ejecutable
  5. Se acabó el tiempo de reposo o el tiempo de espera, entra en el temporizador de espera y el objeto de bloqueo se adquiere antes de que pueda entrar en el estado ejecutable, y el objeto de bloqueo se introduce en el estado de bloqueo de bloqueo cuando se acaba el tiempo.
  6. Terminación del hilo

Análisis de cuatro operaciones CAS (un bloqueo optimista con granularidad de bloqueo extremadamente baja)

AtomicInteger.incrementAndGet ();

public final int incrementAndGet() {
    
    
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
public final int getAndAddInt(Object var1, long var2, int var4) {
    
    
    int var5;
    do {
    
    
    var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
    return var5;
}

1. Contiene 3 parámetros CAS (V, E, N), V representa el valor de la variable a actualizar, E representa el valor esperado y N representa el nuevo valor. Solo cuando el valor de V es igual al valor de E, el valor de V se establecerá en N. Si el valor de V y E son diferentes, significa que otro hilo ha realizado dos actualizaciones y el hilo actual lo hará. ninguna cosa. Finalmente, CAS devuelve el valor real de la V.

2.compareAndSwapInt es una interfaz nativa

3. El principio de implementación subyacente: a través de la instrucción mov, mueva el exchange_value y otros valores al registro, y luego a través del acumulador para calcular el valor, y finalmente a través del bus para actualizar la memoria principal para lograr el efecto.

Cinco cerraduras pesadas traídas sincronizadas, y las cerraduras sesgadas al comienzo del hilo, y cerraduras ligeras

El estado de la cerradura

5.1 objetos Java

  1. Encabezado de objeto + datos de instancia + relleno de alineación
  2. Marque Word + puntero a la clase a la que pertenece el objeto (si es un objeto de matriz, también contendrá la longitud
    La estructura de los objetos java

5.2 Cómo actualizar la cerradura

  1. Bloqueo de polarización -> Bloqueo de peso ligero -> Bloqueo de peso pesado
  2. Actualización de bloqueo de polarización: cuando un hilo obtiene un bloqueo de polarización, durante la ejecución, siempre que otro hilo intente obtener un bloqueo de polarización y el hilo que actualmente mantiene el bloqueo de polarización todavía se esté ejecutando en el bloque de sincronización, el bloqueo de polarización se actualizará a Bloqueo de magnitud de luz.
  3. Actualización de cerradura ligera: utilice la operación CAS para reemplazar la palabra de marca de la cerradura con el puntero del registro de cerradura copiado en la pila de subprocesos. Si tiene éxito, el subproceso actual adquiere el bloqueo. Si falla, significa que Mark Word ha sido reemplazado con el registro de bloqueo de otros subprocesos, lo que indica que está compitiendo con otros subprocesos por el bloqueo, y el subproceso actual intenta Usa el giro para adquirir la cerradura. Cuando el número de autoselección supera un cierto número, se actualizará a un candado de peso pesado

Seis análisis de parámetros y concepto de grupo de subprocesos ThreadPoolExecutor

6.1 Parámetros principales

nombre del parámetro Significado del parámetro
corePoolSize Número de subprocesos centrales
maxinumPoolSize Número máximo de subprocesos
keepAliveTime Tiempo de supervivencia del hilo inactivo
unidad Unidad de tiempo de supervivencia
workQueue Almacenar la cola de tareas del subproceso
threadFactory Fábrica de hilos, crea un hilo nuevo
manipulador El grupo de subprocesos se niega a procesar la tarea

Flujo de trabajo del grupo de subprocesos
corePoolSize: representa la cantidad de subprocesos centrales, estos subprocesos no se eliminarán después de la creación, sino una especie de subproceso residente
maxinumPoolSize: representa la cantidad máxima de subprocesos permitidos para ser creados, cuando la cantidad de subprocesos centrales se
agotan workQueue: usado para almacenar para ejecutar La tarea, asumiendo que ahora tenemos todos los subprocesos principales que se utilizan y las tareas entran, todas se colocan en la cola, hasta que se llena toda la cola pero la tarea continúa entrando, comenzará a crear nuevos subprocesos
keepAliveTime, unit: significa más allá del subproceso central El tiempo de supervivencia inactivo de los subprocesos fuera del número, es decir, los subprocesos centrales no se eliminarán, pero algunos subprocesos que excedan el número de subprocesos centrales se eliminarán si están inactivos durante un cierto período de tiempo.
threadFactory: fábrica de hilos, usado para producir hilos para realizar tareas.
Handler: Hay dos métodos de a a desencadenar la estrategia de rechazo tarea, 1. Llame apagado 2. el número máximo de subprocesos en el grupo de subprocesos se ha alcanzado, esta el tiempo también es rechazado

已满
已满
已达到
未满
未满
未满
线程池执行任务
核心线程是否已满
核心线程是否已满
核心线程是否已满
据拒绝策略处理任务
创建核心线程执行
将任务放入到队列中
创建临时线程执行

6.2 Política de rechazo

  1. ThreadPoolExecutor.AbortPolicy: Descarta la tarea y lanza RejectedExecutionException.
  2. ThreadPoolExecutor.DiscardPolicy: también descarta tareas, pero no lanza excepciones.
  3. ThreadPoolExecutor.DiscardOldestPolicy: Descarte la primera tarea en la cola y luego intente ejecutar la tarea nuevamente (repita este proceso)
  4. ThreadPoolExecutor.CallerRunsPolicy: la tarea es manejada por el hilo de llamada

6.3 Dos métodos de envío del grupo de subprocesos: enviar y ejecutar

  • Ejecutar solo puede enviar tareas de tipo Ejecutable y no tiene ningún valor de retorno. Enviar puede enviar tareas de tipo Ejecutable o Invocable. Habrá un valor de retorno de tipo Futuro, pero cuando el tipo de tarea es Ejecutable, el valor de retorno es nulo.
  • Cuando execute ejecuta una tarea, si encuentra una excepción la lanzará directamente, pero submit no la lanzará directamente, solo lanzará una excepción cuando el valor de retorno se obtenga usando el método get de Future.

6.4 workQueue

  1. SynchronousQueue: cola de bloqueo
  2. LinkedBlockingQueue: cola ilimitada
  3. ArrayBlockingQueue: una cola de bloqueo limitada admitida por una matriz, FIFO

Siete colecciones concurrentes en java

  1. CopyOnWriteArrayList es equivalente a ArrayList seguro para subprocesos

  2. CopyOnWriteArraySet es equivalente a HashSet seguro para subprocesos

  3. ConcurrentHashMap es equivalente a HashMap seguro para subprocesos

  4. ConcurrentSkipListMap es equivalente a un TreeMap seguro para subprocesos

  5. ConcurrentSkipListSet es equivalente a un TreeSet seguro para subprocesos

  6. ArrayBlockingQueue es una cola de bloqueo limitada segura para subprocesos implementada por matriz

  7. LinkedBlockingQueue es una cola de bloqueo implementada por una lista enlazada individualmente (se puede especificar el tamaño)

  8. ConcurrentLinkedQueue es una cola ilimitada implementada por una lista enlazada individualmente

Supongo que te gusta

Origin blog.csdn.net/m0_37111373/article/details/113944012
Recomendado
Clasificación