Subproceso múltiple inseguro e interbloqueo de subprocesos, bloqueo de sincronización Sincronizar

Inseguridad de subprocesos e interbloqueo de subprocesos, bloqueo de sincronización Sincronizar

¿Qué es la inseguridad del hilo?

Cuando varios subprocesos comparten el mismo recurso, realizar operaciones de lectura y escritura en el recurso compartido sin utilizar bloqueos de sincronización dará como resultado resultados de ejecución anormales del programa y datos de resultados anormales. Por ejemplo: dos personas toman un boleto. Cuando el último es fuerte, ambas personas ven un boleto en sus ojos, por lo que ambos van a tomar el boleto al mismo tiempo. Como resultado, ambas personas tomaron el boleto y el número de tickets se convierte en 1.

¿La solución a la inseguridad del hilo?

La solución a la inseguridad de los subprocesos es bloquear el subproceso y utilizar el mecanismo de sincronización de subprocesos para sincronizar . La sincronización de subprocesos es en realidad un mecanismo de espera.Cuando varios subprocesos acceden al mismo recurso, deben ingresar a un grupo de espera para formar una cola , esperando que el subproceso anterior se agote y el siguiente subproceso para usarlo.
Inserte la descripción de la imagen aquí
Mecanismo de uso de colas.

Sincronizar bloqueo de sincronización

Mecanismo de formación: cola + bloqueo
Cuando un hilo adquiere un bloqueo exclusivo de un objeto, otros hilos deben esperar y esperar a que el hilo termine de usarlo (abrir el bloqueo) antes de usarlo.
¿Es fácil causar problemas el uso de bloqueos de sincronización?

  • El hilo debe esperar al final del hilo anterior antes de que pueda usarse, lo que provocará problemas de eficiencia del programa.
  • En el caso de varios subprocesos y bloqueos de objetos de recursos múltiples, un subproceso puede ocupar los recursos para ser utilizados por otro proceso, y está en un estado de espera a que el subproceso libere el bloqueo. Si el subproceso ha estado ocupando el bloqueo, entonces producirá un problema de interbloqueo de subprocesos.
  • Si un subproceso con una prioridad alta espera a que un subproceso con una prioridad más baja libere el bloqueo, afectará los problemas de rendimiento (por ejemplo, muchos subprocesos simples están esperando que un subproceso complejo procese transacciones, lo que afectará la eficiencia de ejecución).

Bloqueo de sincronización de sincronización : método de sincronización y bloque de código de sincronización El
bloqueo predeterminado del método de sincronización es este (el objeto actual), y cualquier objeto puede convertirse en un bloqueo.

   private synchronized  void buyTicket() {
        System.out.println(Thread.currentThread().getName() + ":我抢到了一个票" + ticketnum--);
        // 控制线程结束
        if (ticketnum <= 0) {
            falg = false;
        }
    }

Bloque de código de sincronización: generalmente utiliza recursos compartidos u objetos de recursos que deben manipularse como bloqueos.

private   void buyTicket() {
        synchronized (this){   // Obj 代表任何资源对象
            System.out.println(Thread.currentThread().getName() + ":我抢到了一个票" + ticketnum--);
            // 控制线程结束
            if (ticketnum <= 0) {
                falg = false;
            }
        }
    }

PD: El método de suspensión de subprocesos es dejar que el subproceso descanse y esperar sin liberar el bloqueo. Esperar es dejar que el hilo entre en el área de espera y liberar el candado.

¿Qué es el interbloqueo de subprocesos?

El interbloqueo de subprocesos se ha mencionado anteriormente. Cuando varios subprocesos comparten algunos recursos comunes y tienen más de dos bloqueos, todos están esperando que el otro libere el bloqueo, lo que hace que el subproceso esté en un estado de espera.
Ejemplo : tengo un bolígrafo, pero necesito tu papel para escribir y tú necesitas mi bolígrafo para escribir. Pero todos estamos esperando para dejarlo ir a nosotros mismos, lo que resulta en un estado de espera.
lograr:

// 笔对象
class Pen{}
// 纸对象
class Paper{}

// 写字
class Write implements Runnable{
    static  Pen pen = new Pen();
    static  Paper paper = new Paper();
    int flag;
    String name;
    Write(int flag,String name){
         this.flag = flag;
         this.name = name;
    }

    @Override
    public void run() {
        try {
            writeWork();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

public  void writeWork() throws InterruptedException {
        // 当flag 0时获取笔
        if(flag==0){
             synchronized (pen){
                System.out.println(name+":拿到了笔");
                Thread.sleep(2000);
                // 然后去拿纸的锁
                 synchronized (paper){
                     System.out.println(name+":拿到了纸");
                 }
             }
        }else {
            synchronized (paper){
                System.out.println(name+":拿到了纸");
                Thread.sleep(2000);
                // 然后去拿纸的锁
                synchronized (pen){
                    System.out.println(name+":拿到了笔");
                }
            }
        }
    }
}

/**
 * Created by 一只会飞的猪 on 2021/3/8.
 * 实现线程死锁现象,写字 = 笔 + 纸
 */
public class DeadLockThread {
    public static void main(String[] args) {
        new Thread(new Write(0,"小美")).start();
        new Thread(new Write(1,"小丑")).start();
    }
}

Resultado: tanto Xiaomei como el payaso mantuvieron sus propias cerraduras y esperaron por la vida.
Inserte la descripción de la imagen aquí
¿Cómo solucionar el estancamiento?
No existe una buena manera de resolver el interbloqueo. Generalmente, está preparado para bloquear y liberar el bloqueo del objeto según las necesidades comerciales. Tome el ejemplo anterior.
Solo necesitamos permitir que dos personas liberen el bloqueo después de obtener un recurso y luego obtener otro recurso.

public  void writeWork() throws InterruptedException {
        // 当flag 0时获取笔
        if(flag==0){
             synchronized (pen){
                System.out.println(name+":拿到了笔");
                Thread.sleep(2000);
             }
            // 然后去拿纸的锁
            synchronized (paper){
                System.out.println(name+":拿到了纸");
            }
        }else {
            synchronized (paper){
                System.out.println(name+":拿到了纸");
                Thread.sleep(2000);
            }
            // 然后去拿纸的锁
            synchronized (pen){
                System.out.println(name+":拿到了笔");
            }
        }
    }

Resultado: Ambos pueden ser felices.
Inserte la descripción de la imagen aquí
PD: Sincronizar bloqueo de sincronización (sincronización implícita), después de la implementación del alcance, el bloqueo se liberará automáticamente. El bloqueo de bloqueo (la siguiente película) debe liberar activamente el bloqueo (sincronización de visualización)

Supongo que te gusta

Origin blog.csdn.net/qq_31142237/article/details/114552225
Recomendado
Clasificación