14 | Bloqueo y condición (Parte 1): Oculto oculto en paquetes concurrentes
En el campo de la programación concurrente, hay dos problemas centrales: uno es la exclusión mutua , es decir , solo un hilo puede acceder a los recursos compartidos al mismo tiempo; el otro es la sincronización , es decir, cómo los hilos se comunican y cooperan entre los hilos. Estos dos problemas principales pueden resolverse mediante el proceso de gestión. El paquete concurrente de Java SDK implementa el proceso de administración a través de dos interfaces, Lock y Condition, donde Lock se usa para resolver el problema de exclusión mutua y la condición se usa para resolver el problema de sincronización.
Razones para la reingeniería
Estos tres programas pueden compensar el problema de la sincronización. Creo que debería ser capaz de entender aquí. Estas tres soluciones son la razón principal para "recrear las ruedas", que se reflejan en la API, que son los tres métodos de la interfaz de bloqueo. Los detalles son los siguientes:
// 支持中断的API
void lockInterruptibly() throws InterruptedException;
// 支持超时的API
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 支持非阻塞获取锁的API
boolean tryLock();
Cómo garantizar la visibilidad
Utiliza la regla Sucede antes relacionada con volátil
¿Qué es una cerradura reentrante?
Bloqueo justo y bloqueo injusto
Mejores prácticas para usar cerraduras
Siempre se bloquea solo cuando se actualizan las variables miembro de un objeto.
Siempre se bloquea solo cuando se accede a las variables miembro variables.
Nunca se bloquea al llamar a métodos de otros objetos
15 | Bloqueo y condición (Parte 2): ¿Cómo utiliza Dubbo el proceso de tubería para lograr la sincronización de transferencia asincrónica?
Entonces, ¿cómo usar dos variables de condición para implementar rápidamente una cola de bloqueo?
Síncrono y asíncrono
Análisis del código fuente de Dubbo
16 | Semáforo: ¿Cómo implementar rápidamente un limitador de corriente?
Modelo de semáforo
Cómo usar semáforos
Implemente rápidamente un limitador de corriente
Semaphore puede permitir que múltiples hilos accedan a una sección crítica.
¿Existe tal demanda en la realidad? Si Los requisitos más comunes son los diversos recursos agrupados que encontramos en nuestro trabajo , como los grupos de conexiones, los grupos de objetos, los grupos de subprocesos, etc. Entre ellos, es posible que esté más familiarizado con el grupo de conexiones de la base de datos. Al mismo tiempo, debe permitir que varios subprocesos usen el grupo de conexiones al mismo tiempo. Por supuesto, no se permite que cada conexión use otros subprocesos antes de que se libere.
17 | ReadWriteLock: ¿Cómo implementar rápidamente un caché completo?
¿Qué es un bloqueo de lectura-escritura?
Implemente rápidamente un caché
Implemente la carga de caché bajo demanda
Actualización y degradación del bloqueo de lectura-escritura
18 | StampedLock: ¿Hay un bloqueo más rápido que un bloqueo de lectura-escritura?
Tres modos de bloqueo compatibles con StampedLock
ReadWriteLock admite dos modos: uno es bloqueo de lectura y el otro es bloqueo de escritura. StampedLock admite tres modos, a saber: bloqueo de escritura, bloqueo de lectura pesimista y lectura optimista.
Mayor comprensión de la lectura optimista.
Notas sobre el uso de StampedLock
19 | CountDownLatch y CyclicBarrier: ¿Cómo hacer que el ritmo multihilo sea consistente?
Utilice el sistema de reconciliación de optimización paralela
Usando CountDownLatch para lograr el hilo de espera
Optimizar aún más el rendimiento
Usando CyclicBarrier para realizar la sincronización de hilos
20 | Contenedores concurrentes: ¿Qué "pozos" necesitamos llenar?
Contenedor de sincronización y sus consideraciones
Lista 、 Mapa 、 Establecer 和 Cola
Contenedores concurrentes y sus consideraciones
(1) Lista
(2) Mapa
(3) Conjunto
(4) Cola
1.单端阻塞队列 2.双端阻塞队列 3.单端非阻塞队列 4.双端非阻塞队列
21 | Atomic: un modelo de herramientas sin bloqueo
Principio de implementación del esquema sin bloqueo
Resumen atómico
- Tipos de datos atómicos
- Tipo de referencia de objeto atómico
- Matriz atómica
- Actualizador de atributos de objetos atómicos
- Acumulador atomizado
22 | Ejecutor y grupo de hilos: ¿cómo crear el grupo de hilos correcto?
El grupo de subprocesos es un modelo productor-consumidor
Cómo usar el grupo de subprocesos en Java
A qué prestar atención cuando se usa el grupo de subprocesos
23 | Futuro: ¿Cómo usar multihilo para lograr el mejor programa de "hervir té"?
Cómo obtener el resultado de la ejecución de la tarea
Realice el programa óptimo de "quemar agua y hacer té"
24 | CompletableFuture: la programación asincrónica no es tan difícil
Ventajas principales de CompletableFuture
Crear objeto CompletableFuture
Cómo entender la interfaz de CompletionStage
Cómo la interfaz de CompletionStage describe las relaciones en serie, Y las relaciones de agregación, O las relaciones de agregación y el manejo de excepciones.
- Describir las relaciones seriales.
- Describa y convergencia
- Describa o convergencia
- Manejo de excepciones
25 | CompletionService: ¿Cómo realizar tareas asincrónicas en lotes?
Uso de CompletionService para realizar el sistema de consulta
Entonces, ¿cómo se crea un CompletionService?
Descripción de la interfaz de CompletionService
Usando CompletionService para realizar Forking Cluster en Dubbo
26 | Fork / Join: versión independiente de MapReduce
Para tareas paralelas simples, puede usar la solución "grupo de subprocesos + Futuro"; si hay una relación de agregación entre las tareas, ya sea una agregación AND u OR, pueden ser resueltas por CompletableFuture; mientras que las tareas paralelas por lotes, entonces Se puede resolver con CompletionService.
Divide y conquista el modelo de tarea
Uso de Fork / Join
Cómo funciona ForkJoinPool
Simule MapReduce para contar la cantidad de palabras
27 | Respuestas a temas candentes de módulos de herramientas concurrentes
Los pensamientos se dejan al final de cada artículo.