El gran jefe sincronizado finalmente debuta, y la detección de ácido nucleico es un escenario efectivo para la concurrencia de subprocesos múltiples

¡Acostúmbrate a escribir juntos! Este es el segundo día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento

prefacio

imagen.png

  • En los dos artículos anteriores, introdujimos candados sesgados y candados livianos respectivamente. En la última introducción ligera, también revelamos que desarrollaremos artículos relacionados con cerraduras pesadas en el futuro. El llamado bloqueo de peso pesado está de acuerdo con los requisitos.
  • Los bloqueos sesgados y los bloqueos ligeros son en realidad operaciones de aquiescencia, y el resto depende de subprocesos para hacer cola y competir voluntariamente. Al igual que hacemos en la situación actual del brote, debemos hacer cola solos para hacer ácido nucleico.
  • Creo que todos saben que no son confiables cuando se alinean. Hace unos días, ha habido muchos conflictos causados ​​​​por saltar en la cola durante la detección y el cálculo en Internet. Esto se debe a que tenemos una gran base y confiar en nuestra operación consciente a menudo será contraproducente. Entonces, en este momento, nació un papel para nosotros para mantener el orden.

imagen.png

  • Lo mismo es cierto para la espera de subprocesos. Cuando muchos subprocesos están esperando que se liberen los recursos, si no lo gestionamos, eventualmente se convertirá en un desastre. Recuerde el AQS que mencionamos anteriormente. Es una excelente manera de administrar la contención de subprocesos. La cerradura de peso pesado que tenemos aquí también se puede entender de esta manera. Cuando el subproceso espera a que se libere el recurso, ponemos el subproceso en la cola y esperamos la administración.
  • En este punto, creo que también sabe que la operación de la cadena requiere mucho tiempo, por lo que lo llamamos bloqueos de peso pesado.

cerradura de peso pesado

  • Cuando varios subprocesos compiten por el mismo bloqueo, la máquina virtual bloquea los subprocesos que no se bloquean y activa estos subprocesos cuando se libera el bloqueo de destino;
  • El sistema operativo realiza el bloqueo y la reactivación de subprocesos de Java: os pthread_mutex_lock();
  • Al actualizar a un bloqueo de peso pesado, el valor de estado del indicador de bloqueo se convierte en "10" y el puntero al bloqueo de peso pesado se almacena en Mark Word. En este momento, los subprocesos que esperan el bloqueo entrarán en estado de bloqueo.
  • El puntero almacenado en la marca de bloqueo pesado es un puntero al objeto objeMonitor en C++. La estructura del objeto es la siguiente

imagen-20211213151401408.png

  • El bloqueo pesado es consistente con el proceso del objeto Lock que analicé antes, que consiste en suspender el subproceso y ponerlo en la cola para esperar a que se active. Wake-up implica el problema de la conmutación de la CPU, por lo que se denomina bloqueo de peso pesado.

Aviso resumido

  • Heavyweight es muy hostil, por lo que los desarrolladores no reconocen la sincronización. Pero después de jdk8, se ha mejorado gradualmente con la adición de bloqueos sesgados y bloqueos ligeros. Debemos abandonar nuestros prejuicios y aceptarlo. La introducción a los bloqueos relacionados con la sincronización está básicamente aquí. Pero el aprendizaje nunca se detiene. Continuaremos introduciendo el siguiente contenido.

Cerradura ligera de actualización de bloqueo de polarización

Actualización de candado ligero Candado pesado

Proceso de bloqueo y desbloqueo de tres cerraduras

Supongo que te gusta

Origin juejin.im/post/7085159635841187877
Recomendado
Clasificación