Arquitectura de programación (05): concurrencia Java multiproceso

Código fuente de este artículo: GitHub · haga clic aquí || GitEE · haga clic aquí

Un mapa de subprocesos múltiples

Arquitectura de programación (05): concurrencia Java multiproceso

2. Conceptos básicos de subprocesos múltiples

1. Conceptos básicos

Un subproceso es la unidad más pequeña que el sistema operativo puede realizar en la programación de operaciones, incluida en el proceso, y es la unidad de operación real en el proceso. Un subproceso se refiere a un único flujo de control secuencial en un proceso. Varios subprocesos pueden ser concurrentes en un proceso y cada subproceso ejecuta diferentes tareas en paralelo.

2. Método de creación

Herede la clase Thread, implemente la interfaz Runnable, basada en las interfaces Callable y Future, y Timer es un subproceso en segundo plano y un grupo de subprocesos.

3. Estado del hilo

Arquitectura de programación (05): concurrencia Java multiproceso

Descripción del estado: estado inicial, estado de ejecución, estado de bloqueo, estado de espera, estado de espera de horas extra y estado de terminación.

4. Mecanismo de ejecución

Arquitectura de programación (05): concurrencia Java multiproceso

Una aplicación en la JVM se puede ejecutar en paralelo por varios subprocesos. Los subprocesos se asignan uno a uno al subproceso del sistema operativo donde se encuentra el servicio, programado para ejecutarse en la CPU disponible, y se crea un subproceso del sistema operativo al inicio; cuando el subproceso termina, esto Los subprocesos del sistema operativo también se reciclarán.

5. Modelo de memoria

Arquitectura de programación (05): concurrencia Java multiproceso

Cuando la máquina virtual se inicia y se ejecuta, se crean varios subprocesos. Algunos módulos en el área de datos son compartidos por subprocesos y algunos son privados:

Uso compartido de hilos: área de metadatos, montón;

Subproceso privado: pila de máquina virtual, pila de método local, contador de programa;

Una sola CPU solo puede ejecutar un subproceso en un momento específico, por lo que varios subprocesos utilizan varios bloques de espacio y luego compiten constantemente por el período de tiempo de ejecución de la CPU.

Tres conceptos comunes

1. Prioridad del hilo

El programador de subprocesos tiende a ejecutar subprocesos con alta prioridad de subproceso. Una prioridad de subproceso alta indica que la probabilidad de adquirir recursos de CPU es alta, o que los fragmentos de tiempo de ejecución adquiridos son altos y la probabilidad de ser ejecutado es alta, pero no significa que la prioridad baja deba ejecutarse en último lugar.

2. Hilo de demonio

El subproceso del demonio admite subprocesos auxiliares, que principalmente desempeñan un papel de programación y soporte en el programa.Cuando todos los subprocesos que no son demonio en el Jvm terminan, el subproceso del demonio también terminará.

3. Unión de hilos

En el hilo A, ejecute el método de unión del hilo B, luego el hilo A esperará a que el hilo B termine de ejecutarse antes de regresar para continuar con la ejecución.

4. Hilo local

ThreadLocal también se llama variable local de hilo. Crea una copia de la variable en cada hilo. Cada hilo puede acceder a su propia variable de copia interna, y los hilos no se afectan entre sí.

Cuarto, seguridad para hilos

Desde la perspectiva de cómo se ocupan los subprocesos y el espacio de memoria en la figura anterior, es necesario garantizar la seguridad de los subprocesos cuando los subprocesos acceden al bloque de memoria compartida.

1. Control sincrónico

Control de sincronización de palabras clave sincronizadas, puede modificar métodos, modificar bloques de código, modificar métodos estáticos, etc., los recursos de control de sincronización son pocos, pueden mejorar la eficiencia del multiproceso.

2. Mecanismo de bloqueo

Interfaz de bloqueo: una de las interfaces raíz para el bloqueo de recursos en la programación concurrente de Java, que especifica varios métodos básicos para el bloqueo de recursos.

Clase ReentrantLock: Bloqueo reentrante que implementa la interfaz Lock, es decir, si un hilo adquiere el bloqueo de la instancia actual y entra en el método de tarea, puede volver a entrar en el método de tarea sin liberar el bloqueo. Características: exclusión mutua, es decir Solo un hilo entra en la tarea a la vez.

Interfaz de condición: describe las variables de condición que pueden estar asociadas con el bloqueo y proporciona funciones más potentes. Por ejemplo, Conditon puede implementar notificaciones múltiples y notificaciones selectivas en el mecanismo de notificación / espera de subprocesos.

3. Palabras clave volátiles

Volátil modifica las variables miembro y no puede modificar el método, es decir, cuando el subproceso accede a esta variable, debe obtenerse de la memoria compartida. Las modificaciones a la variable también deben vaciarse en la memoria compartida sincrónicamente, lo que garantiza la visibilidad de la variable para todos los subprocesos.

Cinco, comunicación por hilo

Un subproceso es una entidad independiente, pero en el proceso de ejecución del subproceso, si se procesa la misma lógica de negocios, puede ocurrir una contención de recursos, lo que resulta en problemas de concurrencia e incluso en un punto muerto. La coordinación entre subprocesos requiere un mecanismo de comunicación para garantizar.

1. Método básico

El método relacionado es el método básico del nivel de Objeto en Java, y cualquier objeto tiene este método: notificar () informa aleatoriamente a un hilo que espera en el objeto para finalizar el estado de espera y regresar; el hilo de espera () entra en el estado de espera, no lo hará Compitiendo por el objeto de bloqueo, también puede establecer el tiempo de espera;

2. Mecanismo de espera / notificación

Mecanismo de espera / notificación. En este modo, el hilo A llama al método del objeto wait () para entrar en el estado de espera cuando la ejecución de la tarea no está satisfecha. El hilo B modifica la condición de ejecución del hilo A y llama al objeto notificar () o notificar a todos () método , El subproceso A vuelve del estado de espera después de recibir la notificación y luego realiza las operaciones posteriores. Los dos hilos completan la interacción entre la espera y la notificación a través de wait () / notificar () / notificar a todos () proporcionada por el objeto, lo que mejora la escalabilidad del programa.

3. Comunicación de flujo de canalizaciones

El flujo de canalización se utiliza principalmente para transferir datos directamente entre diferentes subprocesos. Un subproceso envía datos a la tubería de salida y el otro subproceso lee datos de la tubería de entrada, realizando así la comunicación entre diferentes subprocesos.

Seis, grupo de hilos

1. Interfaz de ejecutor

En el sistema Executor, el envío de tareas de subprocesos y la ejecución de tareas están diseñados para ser desacoplados. Executor tiene varias clases de implementación poderosas que brindan formas convenientes de enviar tareas y obtener resultados de ejecución de tareas, encapsulando el proceso de ejecución de tareas y ya no lo necesitan El método Thread (). Start () crea subprocesos y realiza tareas asociadas a ellos de forma explícita.

2. Parámetros básicos

Arquitectura de programación (05): concurrencia Java multiproceso

3. Clases de API relacionadas

Arquitectura de programación (05): concurrencia Java multiproceso

Tarea de grupo de subprocesos: interfaz central: Ejecutable, interfaz invocable y clase de implementación de interfaz;

El resultado de la tarea: interfaz Future y clase de implementación FutureTask;

Ejecución de tareas: interfaz central Ejecutor e interfaz ExecutorService. En el marco de Executor, hay dos clases centrales que implementan la interfaz ExecutorService, ThreadPoolExecutor y ScheduledThreadPoolExecutor.

Siete, API de hilo común

1. Mecanismo de horquilla / unión

El marco Fork / Join se utiliza para ejecutar tareas en paralelo. La idea central es dividir una tarea grande en múltiples tareas pequeñas y luego resumir los resultados de ejecución de cada tarea pequeña para obtener el resultado final de la tarea grande. Proceso principal: división de tareas, ejecución asincrónica de las tareas del módulo y combinación de resultados de una sola tarea.

2. Contenedor

ConcurrentHashMap: use el mecanismo de bloqueo de segmento para dividir los datos en el contenedor en segmentos y almacenarlos en segmentos, y luego asignar un bloqueo a cada segmento de datos. Cuando un hilo ocupa el bloqueo para acceder a un segmento de datos, los datos de otros segmentos también pueden ser utilizados por otros segmentos. Acceso a subprocesos, considerando tanto la seguridad como la eficiencia de ejecución.

ConcurrentLinkedQueue: *** cola segura para subprocesos basada en nodos de enlace, ordena los elementos de acuerdo con el principio FIFO, el encabezado de la cola es el elemento con más tiempo en la cola y la cola de la cola es el elemento con el menor tiempo en la cola, nuevo El elemento se agrega al final de la cola y la operación de obtención del elemento se obtiene del encabezado de la cola.

3. Atómico

El JDK viene con clases de operación atómica, que manejan la operación simultánea de una variable por múltiples subprocesos, incluidos: tipos básicos, tipos de matriz, tipos de referencia y tipos de modificación de atributos.

Ocho escenarios de aplicación

1. Tareas cronometradas

A través de los ajustes de configuración, algunos programas se ejecutan regularmente en un momento específico o tiempo de ciclo La ejecución de tareas aquí se basa en tecnología de subprocesos múltiples.

2. Procesamiento asincrónico

El procesamiento asíncrono significa que el programa no se ejecuta de acuerdo con el bloque de código síncrono actual. El procesamiento asíncrono y el procesamiento síncrono son opuestos. La realización de asíncrono también requiere múltiples subprocesos o múltiples procesos para mejorar la eficiencia del programa.

3. Descomposición de tareas

Operaciones comunes en bases de datos distribuidas. Los datos se distribuyen en copias de diferentes bases de datos. Al realizar una consulta, cada servicio debe ejecutar una tarea de consulta y, finalmente, fusionar los datos en un servicio o proporcionar una capa de motor intermedia para la agregación Los datos, en las tareas de temporización a gran escala, las tareas a procesar a menudo se fragmentan de acuerdo con una estrategia específica y se procesan varios subprocesos al mismo tiempo.

4. Tecnología de grupo de conexiones

La tecnología de crear y administrar un grupo de conexiones intermedias, estas conexiones están listas para ser utilizadas por cualquier hilo que las necesite, reduciendo el problema de la creación y liberación continua de conexiones y mejorando la eficiencia del programa.

Nueve, dirección de código fuente

GitHub·地址
https://github.com/cicadasmile
GitEE·地址
https://gitee.com/cicadasmile

Lectura recomendada: sistema de programación de acabado

Número de serie nombre del proyecto Dirección de GitHub Dirección GitEE Recomendado
01 Java describe patrones de diseño, algoritmos y estructuras de datos GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
02 Fundamentos Java, concurrencia, orientado a objetos, desarrollo web GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆
03 Explicación detallada del caso del componente básico del microservicio SpringCloud GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆
04 Caso completo de arquitectura de microservicio SpringCloud GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
05 Comenzando con la aplicación básica del marco SpringBoot a avanzado GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆
06 SpringBoot framework integra y desarrolla middleware común GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
07 Caso básico de gestión de datos, distribución, diseño de arquitectura GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆
08 Grandes series de datos, almacenamiento, componentes, informática y otros marcos GitHub · haga clic aquí GitEE · Haga clic aquí ☆☆☆☆☆   

Supongo que te gusta

Origin blog.51cto.com/14439672/2539837
Recomendado
Clasificación