Maison  >  Article  >  Java  >  Quelles sont les situations qui provoquent un blocage en Java ?

Quelles sont les situations qui provoquent un blocage en Java ?

王林
王林avant
2023-05-23 12:46:06964parcourir

4 situations dans lesquelles Java provoque un blocage

1. Le verrouillage croisé provoque un blocage du programme : par exemple, le thread A détient le verrou de R1 et attend le verrou de R2, et le thread B détient le verrou de R2 et attend le verrou de R1. .

2. Mémoire insuffisante : par exemple, il y a deux threads T1 et T2 qui ont obtenu 10 Mo de mémoire, et T2 ont obtenu 15 Mo de mémoire. T1 et T2 doivent tous deux obtenir 30 Mo de mémoire pour fonctionner, mais le reste est disponible. la mémoire est de 10 Mo. De cette façon, les deux threads s'attendent tous pour libérer des ressources mémoire.

3. Échange de données par questions et réponses : le serveur ouvre un certain port et attend que le client y accède. Une fois que le client a envoyé la demande, le serveur manque la demande du client pour une raison quelconque, ce qui oblige le client à attendre la demande. le serveur répond, tandis que le serveur attend que le client envoie une requête.

4. Blocage causé par une boucle infinie : c'est relativement courant. Vous ne pouvez pas voir le blocage à l'aide d'outils tels que jstack, mais le programme ne fonctionne pas et l'utilisation du processeur est élevée. Ce type de blocage est également appelé animation suspendue du système. et est difficile à dépanner et à reproduire.

Exemples liés aux impasses

public class Main {
    private final Object MUTEX_READ = new Object();
    private final Object MUTEX_WRITE = new Object();
 
    public void read(){
        synchronized (MUTEX_READ){
            synchronized (MUTEX_WRITE){
            }
        }
    }
 
    public void write(){
        synchronized (MUTEX_WRITE){
            synchronized (MUTEX_READ){
            }
        }
    }
 
    public static void main(String[] args) throws InterruptedException {
        Main m = new Main();
        new Thread(()->{
            while (true){
                m.read();
            }
        }).start();
        new Thread(()->{
            while (true){
                m.write();
            }
        }).start();
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer