Maison  >  Article  >  Java  >  Explication détaillée des différences entre synchrone, asynchrone, bloquant et non bloquant

Explication détaillée des différences entre synchrone, asynchrone, bloquant et non bloquant

Y2J
Y2Joriginal
2017-05-06 13:03:451552parcourir

Cet article présente principalement des informations pertinentes sur l'explication détaillée des différences entre synchronisation, asynchrone, bloquante et non bloquante en Java. Les amis dans le besoin peuvent se référer à

Synchronisation, asynchrone, bloquante et. non bloquant en Java Explication détaillée de la différence

Pour faire simple :

Le blocage signifie que vous n'êtes pas autorisé à revenir tant que vous n'avez pas terminé le travail, et vous attendez toujours que le dossier soit traité avant de revenir

Non bloquant signifie que vous le faites en premier, et je vérifierai s'il y a autre chose à faire en premier ; quelque chose est bloqué, signalez-le immédiatement au chef.

Prenons comme exemple les deux fonctions les plus couramment utilisées, send et recv...

Par exemple, si vous appelez la fonction send pour envoyer un certain octet, le travail effectué par envoi à l'intérieur du système, il transfère (copie) simplement les données vers le tampon de sortie de la pile de protocole TCP/IP. Son exécution réussie ne signifie pas que les données ont été envoyées avec succès si la pile de protocole TCP/IP ne le fait pas. avoir suffisamment de tampons disponibles pour sauvegarder les données que vous avez copiées, Quant aux données... c'est là que la différence entre bloquant et non bloquant entre en jeu : la fonction d'envoi du socket en mode bloquant ne reviendra que lorsque le tampon système aura suffisamment d'espace pour copiez les données que vous souhaitez envoyer. Pour les sockets non bloquantes, send renverra immédiatement WSAEWOULDDBLOCK pour dire à l'appelant : "L'opération d'envoi est bloquée !!! Vous pouvez trouver un moyen de la gérer..."

Pour la fonction recv, le même principe s'applique. Le mécanisme de fonctionnement interne de la fonction attend en fait que le tampon de réception de la pile du protocole TCP/IP le notifie : Bonjour, vos données arrivent. si le tampon de réception de la pile de protocole TCP/IP ne notifie pas un résultat, il ne renvoie jamais : consommation de ressources système.... Pour les sockets en mode non bloquant, la fonction retournera immédiatement, puis vous dira : WSAEWOULDDBLOCK- --"Il n'y a pas de données maintenant, revenez plus tard"

Extension :

Lors de la programmation réseau, nous voyons souvent quatre méthodes d'appel : synchrone, asynchrone, bloquant et non bloquant. Ces méthodes ne sont pas faciles à comprendre. Vous trouverez ci-dessous ma compréhension de ces termes.

1. Synchronisation

La soi-disant synchronisation signifie que lors de l'émission d'un appel de fonction, l'appel ne reviendra pas tant que le résultat n'est pas obtenu. . Selon cette définition, en fait, la plupart des fonctions sont appelées de manière synchrone (comme sin, isdigit, etc.). Mais de manière générale, lorsque nous parlons de synchrone et d'asynchrone, nous faisons spécifiquement référence à des tâches qui nécessitent la coopération d'autres composants ou prennent un certain temps à réaliser. L'exemple le plus courant est SendMessage. Cette fonction envoie un message à une fenêtre et ne revient que lorsque l'autre partie a traité le message. Une fois le traitement terminé par l'autre partie, la fonction renvoie la valeur LRESULT renvoyée par la fonction de traitement des messages à l'appelant.

2. Asynchrone

Le concept d'asynchrone est opposé à synchrone. Lorsqu'un appel de procédure asynchrone est émis, l'appelant n'obtient pas le résultat immédiatement. Le composant qui gère réellement l'appel informe l'appelant via le statut, les notifications et les rappels lorsqu'il est terminé. Prenons l'exemple de la classe CAsycSocket (notez que CSocket est dérivé de CAsyncSocket, mais sa fonction a été convertie d'asynchrone en synchrone). Lorsqu'un client émet une demande de connexion en appelant la fonction Connect, le thread appelant peut immédiatement s'exécuter vers le bas. Lorsque la connexion est effectivement établie, la couche inférieure du socket enverra un message pour avertir l' objet . Il est mentionné ici que le composant d'exécution et l'appelant renvoient les résultats via trois canaux : statut, notification et rappel. Celui qui peut être utilisé dépend de la mise en œuvre de l'exécutif et n'est pas sous le contrôle de l'appelant, à moins que l'exécutif ne propose plusieurs choix. Si le composant d'exécution utilise le statut pour notifier, alors l'appelant doit le vérifier à intervalles réguliers, ce qui est très inefficace (certaines personnes qui débutent dans la programmation multithread aiment toujours utiliser une boucle pour vérifier une certaine variable valeur, c'est en fait une erreur très grave). Si la notification est utilisée, l'efficacité est très élevée car le composant d'exécution ne nécessite quasiment aucune opération supplémentaire. Quant à la fonction de rappel , elle n'est en réalité pas très différente de la notification.

3. Blocage

Le blocage de l'appel signifie que le fil de discussion en cours sera suspendu avant que le résultat de l'appel ne soit renvoyé. La fonction ne revient qu'après avoir obtenu le résultat. Certaines personnes peuvent assimiler les appels bloquants aux appels synchrones, mais en réalité, ils sont différents. Pour les appels synchrones, dans de nombreux cas, le thread actuel est toujours actif, mais logiquement, la fonction actuelle ne renvoie pas. Par exemple, nous appelons la fonction Recevoir dans CSocket S'il n'y a aucune donnée dans le tampon, cette fonction attendra qu'il y ait des données avant de revenir. À ce stade, le fil de discussion actuel continuera à traiter divers messages. Si la fenêtre principale et la fonction appelante se trouvent dans le même thread, à moins que vous ne l'appeliez dans une fonction d'opération d'interface spéciale, l'interface principale doit toujours être actualisée. Recv, une autre fonction utilisée par le socket pour recevoir des données, est un exemple d'appel bloquant. Lorsque le socket fonctionne en mode blocage, si cette fonction est appelée sans données, le thread actuel sera suspendu jusqu'à ce qu'il y ait des données.

4. Non bloquant

Les notions de non bloquant et de blocage se correspondent, ce qui signifie que la fonction ne bloquera pas jusqu'à ce que le résultat ne puisse pas être obtenu immédiatement dans le fil de discussion actuel et qu'il revienne immédiatement.

Le mode de blocage de l'objet et l'appel de la fonction de blocage

Il existe une forte corrélation entre le fait que l'objet soit en mode de blocage et le fait que la fonction bloque l'appel, mais il n'y a personne- correspondance à un. Il peut y avoir des méthodes d'appel non bloquantes sur les objets bloquants. Nous pouvons interroger l'état via une certaine API et appeler la fonction de blocage au moment approprié pour éviter le blocage. Pour les objets non bloquants, l'appel de fonctions spéciales peut également entrer des appels bloquants. La fonction select en est un exemple.

[Recommandations associées]

1. Tutoriel vidéo Java gratuit

2. Tutoriel vidéo Java de la Geek Academy

.

3. Manuel du didacticiel Java

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:
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