Notes d'étude JAVA (multithreading 4) - sécurité des threads 4 (problème d'interblocage des threads)

Notes d'étude JAVA (multithreading 4) - sécurité des threads 4 (problème d'interblocage des threads)

Problème d'interblocage de thread L'interblocage se produit à cause de :

  • Différents threads occupent les ressources de synchronisation nécessaires à l'autre partie et n'abandonnent pas. Ils attendent tous que l'autre partie renonce aux ressources de synchronisation dont ils ont besoin, ce qui forme un blocage de thread.
  • Après un blocage, il n'y aura pas d'exception ni d'invite, mais tous les threads sont bloqués et ne peuvent pas continuer

Résolution :

  1. algorithmes et principes spécialisés
  2. Minimiser la définition des ressources de synchronisation
  3. Essayez d'éviter la synchronisation imbriquée

blocage de thread

  1. La compréhension du blocage : différents threads occupent les ressources de synchronisation nécessaires à l'autre partie et n'abandonnent pas. Ils attendent tous que l'autre partie renonce aux ressources de synchronisation dont ils ont besoin, ce qui forme un blocage de thread.

  2. Explication :
    (1) Après qu'un interblocage se produit, il n'y aura pas d'exception ou d'invite, mais tous les threads sont bloqués et ne peuvent pas continuer
    (2) Notre programme doit essayer d'éviter l'interblocage

Impasse

public class DeadLock {
    
    
    public static void main(String[] args) {
    
    
        /**
         * 演示一下线程的死锁
         *  1.死锁的理解:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
         * 2.说明:
         * (1)出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续
         * (2)我们的程序应尽量避免死锁
         */
        StringBuffer stringBuffer1=new StringBuffer();
        StringBuffer stringBuffer2=new StringBuffer();

        //匿名类实现线程(相当于继承Thread类的方式)
        new Thread(){
    
    
            @Override
            public void run() {
    
    
                synchronized(stringBuffer1){
    
    
                    stringBuffer1.append("a");
                    stringBuffer2.append("1");
                    try {
    
    
                        sleep(100);//出现死锁概率大大增加了
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                }
                synchronized(stringBuffer2){
    
    
                    stringBuffer1.append("b");
                    stringBuffer2.append("2");
                    try {
    
    
                        sleep(100);
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                }
                System.out.println(stringBuffer1);
                System.out.println(stringBuffer2);
            }
        }.start();
        //匿名类实现线程(相当于实现Runnable接口的方式)
        new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                synchronized(stringBuffer2){
    
    
                    stringBuffer1.append("c");
                    stringBuffer2.append("3");
                }
                synchronized(stringBuffer1){
    
    
                    stringBuffer1.append("d");
                    stringBuffer2.append("4");
                }
                System.out.println(stringBuffer1);
                System.out.println(stringBuffer2);
            }
        }).start();
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/m0_46450708/article/details/119037619
conseillé
Classement