Código de programación Springboot
En este momento, para evitar este tipo de problemas, el enfoque general es bloquear un recurso público (es decir, un bloque de código) cuando lo llama un hilo. ?
A continuación se presentan dos métodos de sincronización simples:
Nota: La sincronización es una operación costosa, por lo que se debe minimizar el contenido de la sincronización. ?
No es necesario sincronizar todo el método, solo se deben utilizar bloques de código sincronizados para sincronizar el código clave. ?
1. ¿Método de sincronización?
Es decir, existe una forma de modificarlo mediante palabras clave sincronizadas. ?
Dado que cada objeto en Java tiene un bloqueo incorporado, cuando usa esta palabra clave para modificar un método,
El bloqueo incorporado protege todo el método. Antes de llamar a este método, debe adquirir el bloqueo incorporado; de lo contrario, se bloqueará. ?
Código como:?
¿Demostración de anulación de sincronización pública(){}?
Nota: La palabra clave sincronizada también puede modificar métodos estáticos. Si se llama a este método estático, se bloqueará toda la clase.
2. ¿Bloques de código sincronizados?
Es decir, el bloque de instrucciones modificado con la palabra clave sincronizada. ?
¿Los bloques de oraciones modificados con esta palabra clave se bloquearán automáticamente para su sincronización?
Código como:?
Sincronización(objeto){?
}?
O
lock . lock(); pruebe {
system out . para(int I = 0;i<10;i++) {? // Aumente el tiempo de finalización de la ejecución del bloque de código para facilitar la observación.
sistema . println(I); prueba {
sistema. out.println(thread.currentthread().getname()+"¡Duerme durante 5 segundos!");
thread.sleep(5000); //Amplía el tiempo de finalización de la ejecución del bloque de código para facilitarlo. observación.
} captura (InterruptedException e) {
e .printstacktrace();
}
}
. }Finalmente { lock . unlock();
system out . println(" unlock ");
}12345678910111213141516 Cuando otros subprocesos llaman al subproceso bloqueado, deben esperar a que el último subproceso lo use y luego liberar el recurso antes de continuar con la ejecución. ?
Los dos métodos anteriores son muy simples, no escribiré más, pero al usar estos dos métodos, existen los siguientes problemas:
(1). Cuando el recurso está ocupado, otros subprocesos deben esperar a que se libere el recurso antes de poder ejecutarlo. Este escenario es adecuado para operaciones de bases de datos para garantizar la atomicidad de sus datos. Cuando el recurso que se está apropiando es un recurso público en tiempo real, solo tiene sentido apoderarse de él en un momento determinado. Por ejemplo, en los lugares públicos todos tienen que competir por el control del aire acondicionado. Sin embargo, si se adopta el método anterior, el control del aire acondicionado se ejecutará secuencialmente según el momento en que se realice la solicitud, lo cual no tiene sentido. Por lo tanto, este escenario es adecuado para ejecutar solo el subproceso que se adelanta al recurso primero y eliminar otros subprocesos solicitantes cuando el recurso está ocupado. ¿Esta situación se logra mediante?
3. ¿Semáforo y contrato?
El semáforo es un semáforo basado en recuentos que puede establecer el número total de recursos. Según este total, varios subprocesos compiten por señales de permiso, crean sus propias aplicaciones y regresan. Una vez superado el número total, el hilo solicita permiso y la señal se bloqueará. Cuando haya recursos disponibles, la ejecución continuará.
?
Springboot implementa las siguientes funciones:
@Controller clase pública Controlador(){
Semaphore semaphore = new semaphore (1);? //Definir el número total de recursos.
@GetMapping("/userInfo/request ")
@ResponseBody public string Resquest(){ int permisos disponibles = semáforo permisos disponibles(); //El número de recursos disponibles.
if(permisos disponibles & gt; 0){
System.out.println("Obtener recursos");
}De lo contrario{
System.out.println("El recurso está ocupado, inténtelo de nuevo más tarde"); devuelve "¡El recurso está ocupado!";
}Intente adquirir {
semaphore. (1);? // Solicitud de ocupación de recursos.
System.out.println("Recurso en uso");
Thread.sleep(30000); //Amplía el tiempo de ocupación de recursos para facilitar la observación.
} catch (InterruptedException e) {
e . printstacktrace();
}Finalmente {
semaphore(1) ;//Liberar recursos
}Devuelve "éxito";
}
}123456789101112131415161718192021222324252627
Cuando solo hay una solicitud de recurso, el efecto de la siguiente manera:?
Después de ejecutar el programa, ¿la página volverá correctamente?
Cuando varios subprocesos solicitan recursos al mismo tiempo, el efecto es el siguiente:?
¿El hilo que obtiene el recurso primero mostrará éxito después de 30 segundos y el hilo que solicitó el recurso regresará directamente?
Esta es la idea general y el marco, que puede modificarse según sus propias necesidades.