No es difícil ejecutar un programa; ¡lo difícil es qué tan lejos puede ejecutarse el programa! —— una semilla feroz
Serie de concurrencia JUC
Serie de concurrencia JUC (1): ¿Qué? Escuché que confunde concurrencia y serie de concurrencia JUC paralela
(2): condición detallada para lograr una activación de notificación precisa
La existencia del núcleo de bloqueo es de múltiples subprocesos y concurrente, solo una comprensión profunda de los bloqueos, la entrevista de encuentro no entra en pánico, sino también para tratar los problemas de concurrencia en el trabajo práctico con el bloqueo de salario para ser arbitrario.
1. Quién decide el orden de ejecución de varios métodos de sincronización
En circunstancias normales, el orden de ejecución de los dos subprocesos no se ejecuta secuencialmente (de arriba a abajo), sino la existencia de un bloqueo, después de utilizar el mismo bloqueo, se ejecutan en secuencia.
El candado aquí es el candado del mismo objeto, el candado del objeto de la computadora, por lo que quien sea el primero lo ejecutará primero.
Computer computer = new Computer();
1.1 Implementación de código de tipo manual
Aquí hemos escrito dos métodos (dos métodos bloqueados, es decir, método de sincronización), uno está aprendiendo, el otro está jugando.
public class Demo{
public static void main(String[] args) {
Computer computer = new Computer();
new Thread(()->{
computer.study();
},"a").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
computer.game();
},"b").start();
}
}
class Computer{
public synchronized void study(){
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("学习");
}
public synchronized void game(){
System.out.println("打游戏");
}
}
resultado de la operación
Puede ver quién está al frente y quién ejecutará primero, por lo que la orden también es aprender primero y luego jugar.
En segundo lugar, el método de sincronización en varios objetos.
El orden de ejecución de los métodos de sincronización para bloqueos de objetos múltiples sigue siendo el mismo, pero a diferencia de un bloqueo de objetos, los bloqueos de objetos múltiples afectarán el orden de ejecución debido al tiempo de inactividad.
2.1 Implementación del código de golpe manual
En el código anterior, solo bloqueamos un objeto, luego agregamos otro bloqueo de objeto, dos objetos y los mismos dos métodos. ¿Responderías que primero aprendes y luego juegas?
public class Demo{
public static void main(String[] args) {
Computer computer1 = new Computer();
Computer computer2 = new Computer();
new Thread(()->{
computer1.study();
},"a").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
computer2.game();
},"b").start();
}
}
class Computer{
public synchronized void study(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("学习");
}
public synchronized void game(){
System.out.println("打游戏");
}
}
resultado de la operación
La respuesta correcta es: primero juegue y luego aprenda.
Tres. Métodos sincrónicos y no sincrónicos
La diferencia entre el método sincrónico y el método asincrónico es que el método asincrónico no se ve afectado por el bloqueo.
3.1 Implementación de código hecho a mano
En el código 1.1 anterior, hemos agregado un método asincrónico (método ordinario) para ver películas, podemos verificar el orden de ejecución.
public void movie(){
System.out.println("看电影");
}
public class Demo{
public static void main(String[] args) {
Computer computer = new Computer();
new Thread(()->{
computer.study();
},"a").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
computer.game();
},"b").start();
new Thread(()->{
computer.movie();
},"c").start();
}
}
class Computer{
public synchronized void study(){
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("学习");
}
public synchronized void game(){
System.out.println("打游戏");
}
public void movie(){
System.out.println("看电影");
}
}
resultado de la operación
Cuatro, método de sincronización estática
En el artículo anterior hablamos de las clases internas de Java de forma sencilla. Hablamos de que static es el primero en ejecutarse, y se llamará automáticamente cuando se cargue el bytecode, y antes del método main main, es anterior al método de construcción. En este momento, las propiedades y métodos no estáticos aún no están disponibles. Completa la inicialización.
Comprensión en profundidad ultra detallada de las clases internas de Java
El método estático está disponible tan pronto como se carga la clase, por lo que la clase bloqueada en sí es el mismo objeto.
4.1 Implementación de código de tipo manual
Seguimos creando dos bloqueos de objetos, pero la diferencia es que nuestros métodos han agregado static para convertirse en métodos estáticos, veamos el orden de ejecución.
public class Demo{
public static void main(String[] args) {
Computer computer = new Computer();
new Thread(()->{
computer.study();
},"a").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
computer.game();
},"b").start();
}
}
class Computer{
public static synchronized void study(){
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("学习");
}
public static synchronized void game(){
System.out.println("打游戏");
}
}
resultado de la operación
5. Comparación del método de sincronización estática y el método de sincronización ordinario
Si comprende el método de sincronización estático anterior, creo que también comprende la diferencia entre el método de sincronización estática y el método de sincronización ordinario.
El método de sincronización estática estática bloquea la clase de clase, mientras que el método de sincronización normal bloquea la llamada, por lo que son dos bloqueos diferentes.
Después de comprender este pasaje, también comprenderá el código y el resultado de salida.
5.1 Implementación del código manual
El siguiente código también crea un objeto, o dos métodos, la diferencia es que el aprendizaje de salida es un método de sincronización estático, mientras que el juego de salida es un método normal, si puede entender
public class Demo{
public static void main(String[] args) {
Computer computer = new Computer();
new Thread(()->{
computer.study();
},"a").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
computer.game();
},"b").start();
}
}
class Computer{
public static synchronized void study(){
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("学习");
}
public synchronized void game(){
System.out.println("打游戏");
}
}
resultado de la operación
Puede ver que el método de sincronización estática y el método de sincronización ordinario son dos bloqueos diferentes. Si no hay suspensión, el método de sincronización estática se ejecuta primero, porque se llama cuando se carga la clase (cosas importantes, innumerables veces), pero Sin embargo, en el caso del retraso de suspensión, nuestro método ordinario se ejecuta primero debido al retraso;
recuerde que el método de sincronización estática y el método ordinario no son el mismo bloqueo, el primero es la clase y el segundo es el llamador.
Seis, finalmente
Al final, para una mejor experiencia de lectura, pongo todo lo que quiero decir a continuación, jeje.
Soy semilla de decisiones basadas en mi voluntad, en serio compartir lo que escribí en el blog ha sido el mismo credo.
Si puedes leer esta entrada del blog, significa que todavía estamos muy destinados; espero que te pueda traer algo de ayuda, la creación no es fácil, quita el conocimiento de mi artículo, tus tres seguidos dejan, me gusta, comenta, sigue , Es mi mayor motivación.