Maison  >  Article  >  Java  >  Java même fil

Java même fil

黄舟
黄舟original
2017-02-28 10:22:401416parcourir

Le même thread est un modèle de concurrence. La signification de ce modèle de concurrence est qu'un système monothread est étendu vers l'extérieur en N systèmes monothread. Le résultat est N systèmes monothread fonctionnant en parallèle.

Un système à même thread n'est pas un système purement à un seul thread car il contient plusieurs threads. Mais chacun de ces threads fonctionne comme un système à thread unique.

Pourquoi est-ce un système monothread ?

Aujourd'hui, vous vous demandez peut-être pourquoi chaque système est conçu pour être monothread. Les systèmes monothread ont gagné en popularité car leur modèle de concurrence est plus simple que le multithreading. Un système monothread ne partage aucune donnée avec d’autres threads. Cela permet aux threads d'utiliser des structures de données non concurrentes et de mieux utiliser le processeur et le cache du processeur.

Malheureusement, les systèmes monothread ne tireront pas pleinement parti des processeurs modernes. Un processeur moderne possède souvent 2, 4 cœurs ou plus. Chaque cœur fonctionne comme un processeur distinct. Un système monothread n'utilise qu'un seul de ces cœurs, comme indiqué ci-dessous :


Même thread, extension du monothread

Pour utiliser pleinement tous les cœurs de processeur, un système monothread peut être étendu pour utiliser l'ensemble de l'ordinateur.

Un thread par CPU

Le même système de thread exécute généralement un thread par CPU dans l'ordinateur. Si cet ordinateur comprend 4 processeurs, ou un processeur à 4 cœurs, alors il exécutera en standard 4 instances du même thread (4 systèmes monothread), comme indiqué dans le schéma :


Aucun état partagé

Un système de threads identique ressemble à un système multithread car plusieurs threads sont exécutés en interne. Mais il y a ici une différence subtile.

La différence entre le même thread et un système multithread est qu'il n'y a pas de données partagées dans le même système de thread. Aucune mémoire n'est accédée par les threads en même temps. Il n'y a pas de structures de données concurrentes, etc. La différence est illustrée dans la figure ci-dessous :


La réduction de l'état partagé fait que chaque thread se comporte comme s'il s'agissait d'un système à thread unique. Cependant, un système à thread identique peut contenir plus d'un seul thread, de sorte qu'il ne s'agit pas véritablement d'un « système à thread unique ». Faute d'un meilleur nom, je trouve plus précis d'appeler un tel système un système à même thread, plutôt qu'un "système multi-thread avec une conception à thread unique". Le même fil est très simple à dire et encore plus simple à comprendre.

Le même thread signifie principalement que les données s'exécutent dans le même thread et qu'il n'y aura pas de données partagées.

Distribution de la charge

De toute évidence, un système de threads identiques doit être partagé entre les instances de thread unique exécutées pour cette charge de travail. Sinon, une seule instance obtiendra du travail et le système sera effectivement monothread.

La manière exacte dont vous répartissez la charge entre les différentes instances dépend de la conception de votre système. J'en couvrirai une partie dans les sections ci-dessous.

Microservices à thread unique

Si votre système contient plusieurs microservices, chaque microservice peut s'exécuter en mode thread unique. Lorsque vous déployez plusieurs microservices à thread unique sur le même ordinateur, chaque microservice peut exécuter un thread distinct sur un processeur distinct.

Les microservices ne partagent aucune donnée, les microservices sont donc un bon cas d'utilisation pour un système avec le même thread.

Services avec données fragmentées

Si votre système n'a pas besoin de partager des données, ou au moins une base de données, vous pourrez peut-être partager ce morceau de cette base de données. Le partage signifie que les données sont divisées en plusieurs bases de données. Les données sont séparées de manière représentative afin que les données associées se trouvent dans la même base de données. Par exemple, toutes les données appartenant à une entité « propriétaire » seront insérées dans la même base de données. Le partage sort du cadre de ce tutoriel, vous devrez donc consulter quelques tutoriels sur le sujet.

Fil de communication

Si les fils d'un même fil ont besoin de communiquer, ils le font via la transmission de messages. Un thread veut envoyer un message au thread A, il peut le faire en générant un message (une séquence d'octets). Le thread B peut alors copier l'intégralité du message (séquence d'octets) et le lire. En copiant le message, le thread B détermine que lorsqu'il modifie le message, le thread A ne peut pas modifier le message. Une fois copié, il est immuable pour le thread A.

Le schéma de principe de ce processus est le suivant :


Cette communication par thread peut être remplacée par des files d'attente, des tuyaux, des sockets Unix et TCP prises. Tout ce qui fonctionne pour votre système.

Modèle de concurrence plus simple

Chaque système exécuté dans son propre thread peut utiliser le même système de thread s'il est à thread unique. Cela signifie que le modèle de concurrence interne devient plus simple que les threads avec état partagé. Vous n'avez pas à vous soucier des structures de données concurrentes ni de tous les problèmes de concurrence.

Illustration

Voici une illustration d'un système monothread, multithread et même thread. Vous pouvez avoir plus facilement un aperçu de leurs différences

Le premier diagramme montre un système monothread :


Chapitre La deuxième image montre un système multithread avec données partagées :


La troisième image montre le même fil avec deux fils avec des systèmes de données séparés qui communiquent entre eux en transmettant des informations.


Ce qui précède est le contenu du même fil Java Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www. .php.cn) !


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