Maison > Java > javaDidacticiel > le corps du texte

Quelles sont les situations qui provoquent un blocage en Java ?

王林
Libérer: 2023-05-23 12:46:06
avant
1055 Les gens l'ont consulté

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();
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal