Heim  >  Artikel  >  Java  >  Gemeinsam genutzte Multithread-Variablen und Kollaborationsmechanismus in Java

Gemeinsam genutzte Multithread-Variablen und Kollaborationsmechanismus in Java

WBOY
WBOYnach vorne
2023-04-20 15:55:202034Durchsuche

    1. Prozesse und Threads

    1. Prozess ist die kleinste Einheit der Ressourcenzuweisung für die Programmausführung

    Ein Prozess ist die kleinste Einheit der Ressourcenzuweisung durch das Betriebssystem, einschließlich: CPU, Speicherplatz, Festplatte IO usw. Mehrere Threads im selben Prozess teilen sich alle Systemressourcen im Prozess und Prozesse sind direkt unabhängig voneinander. Ein Prozess ist ein Programm mit bestimmten unabhängigen Funktionen, das eine laufende Aktivität für einen bestimmten Datensatz ausführt. Ein Prozess ist eine unabhängige Einheit für die Ressourcenzuweisung und -planung im System.

    Ein Prozess ist eine Ausführungsaktivität eines Programms auf dem Computer. Wenn Sie ein Programm ausführen, starten Sie einen Prozess. Offensichtlich sind Programme tot und statisch, während Prozesse aktiv und dynamisch sind. Prozesse können in Systemprozesse und Benutzerprozesse unterteilt werden. Alle Prozesse, die zum Ausführen verschiedener Funktionen des Betriebssystems verwendet werden, sind Systemprozesse. Sie sind das Betriebssystem selbst im laufenden Zustand. Benutzerprozesse sind alle von Ihnen gestarteten Prozesse.

    2. Thread ist die kleinste Einheit der CPU-Planung und muss vom Prozess abhängen.

    Thread ist eine Einheit des Prozesses und die Grundeinheit der CPU-Planung und -Verteilung Grundgerät selbstständig betreiben. Der Thread selbst besitzt grundsätzlich keine Systemressourcen, sondern nur einige Ressourcen, die für die Ausführung unerlässlich sind (z. B. einen Programmzähler, eine Reihe von Registern und einen Stapel), aber er kann alle Ressourcen, die der Prozess besitzt, mit anderen Threads teilen im selben Prozess.

    3. Threads sind überall. Jedes Programm muss einen Thread erstellen, insbesondere

    Java

    , asynchroner Nachrichtenverarbeitungsmechanismus, Fernzugriffsschnittstelle RM usw. Jedes Abhörereignis,

    onClick auslösende Ereignis usw. sind untrennbar mit der Kenntnis von Threads und Parallelität verbunden. 2. Die Beziehung zwischen der Anzahl der CPU-Kerne und der Anzahl der Threads1. , CMP wird von der Stanford University in den Vereinigten Staaten entwickelt. Die Idee besteht darin, den SMP (symmetrischer Prozessor) in großen Parallelprozessoren in denselben Chip zu integrieren, und jeder Prozessor führt unterschiedliche Prozesse parallel aus. Diese Art von Programm, das darauf angewiesen ist, dass mehrere CPU gleichzeitig parallel laufen, ist ein wichtiger Weg, um Ultrahochgeschwindigkeitsrechnen zu erreichen, das als Parallelverarbeitung bezeichnet wird.

    2. Multi-Threading

    Multi-Threading

    :

    Simultanes Multithreading ermöglicht die gleichzeitige Ausführung mehrerer Threads auf demselben Prozessor und die gemeinsame Nutzung der Ausführungsressourcen des Prozessors. 3. Anzahl der Kerne und ThreadsAnzahl der Kerne und Threads: Derzeit sind alle gängigen CPUs Multi-Core-Prozessoren. Durch Erhöhen der Anzahl der Kerne wird auch die Anzahl der Threads erhöht, da das Betriebssystem Aufgaben über Threads ausführt. Im Allgemeinen haben sie eine 1:1

    -Entsprechung, was bedeutet, dass eine

    Quad-Core-CPU

    im Allgemeinen vier Threads hat. Aber nachdem

    Intel die Hyper-Threading-Technologie eingeführt hatte, bildeten die Anzahl der Kerne und die Anzahl der Threads ein Verhältnis von 1:2.

    3. CPU-ZeitscheibenrotationsmechanismusWenn wir normalerweise entwickeln, haben wir das Gefühl, dass wir nicht durch die Anzahl der CPU-Kerne eingeschränkt sind. Wir können einen Thread starten, wann immer wir wollen, selbst auf einer Single-Core-CPU. Warum? Dies liegt daran, dass das Betriebssystem einen Mechanismus zur Rotation der CPU-Zeitscheibe bereitstellt. Die Zeitscheibenrotationsplanung ist einer der ältesten, einfachsten, fairsten und am weitesten verbreiteten Algorithmen, auch bekannt als RR-Planung. Jedem Prozess wird ein Zeitraum zugewiesen, der als Zeitscheibe bezeichnet wird. Dabei handelt es sich um die Zeit, in der der Prozess ausgeführt wird. 4. Parallelität und ParallelitätWenn es beispielsweise eine Autobahn A mit 4 Fahrspuren gibt, dann sind es maximal 4 parallele Fahrzeuge. Die Anzahl der gleichzeitig nebeneinander fahrenden Fahrzeuge auf dieser Autobahn ist geringer als oder gleich 4, Fahrzeuge können parallel fahren. CPU basiert ebenfalls auf diesem Prinzip. Eine CPU entspricht einer Autobahn, und die Anzahl der Kerne oder Threads entspricht der Anzahl der Fahrzeuge, die nebeneinander vorbeifahren können Autobahnen und jede Autobahn Die Autobahn verfügt über mehrere nebeneinander verlaufende Fahrspuren.

    Wenn Sie über Gemeinsam genutzte Multithread-Variablen und Kollaborationsmechanismus in JavaParallelität

    sprechen, müssen Sie unbedingt die Zeiteinheit hinzufügen, d. h. wie hoch ist die Parallelität pro Zeiteinheit? Es macht eigentlich keinen Sinn, die Einheit Zeit zu verlassen.

    Wie das Sprichwort sagt, kann man nicht zwei Dinge gleichzeitig tun, und das gilt auch für Computer. Im Prinzip kann eine

    CPU

    nur einem Prozess zugewiesen werden, um diesen Prozess auszuführen. Der Computer, den wir normalerweise verwenden, hat nur eine

    CPU

    , was bedeutet, dass er nur ein Herz hat. Damit er Multitasking betreiben und mehrere Prozesse gleichzeitig ausführen kann, muss Parallelitätstechnologie verwendet werden. Die Implementierung der Parallelitätstechnologie ist recht komplex, und am einfachsten zu verstehen ist der „Zeitscheibenrotationsprozessplanungsalgorithmus“.

    1. Parallelität

    并发: bedeutet, dass die Anwendung abwechselnd verschiedene Aufgaben unter einem einzigen CPU-Kern ausführen kann, wenn Sie zwei Threads zur Ausführung öffnen Wir wechseln ständig zwischen der Ausführung dieser beiden Aufgaben, um den Effekt der „gleichzeitigen Ausführung“ zu erzielen, aber die Ausführungsgeschwindigkeit des Computers ist zu hoch, als dass wir es bemerken könnten.

    2. Parallel

    Parallel: bezieht sich auf die Fähigkeit einer Anwendung, gleichzeitig verschiedene Aufgaben auszuführen: Sie können gleichzeitig essen und fernsehen.

    ** Der Unterschied zwischen Parallelität und Parallelität ist: Eines ist alternative Ausführung, das andere ist gleichzeitige Ausführung**

    Gemeinsam genutzte Multithread-Variablen und Kollaborationsmechanismus in Java

    5. Hohe gleichzeitige Programmierung

    Aufgrund der Geburt der Multi-Core-CPU, Multithreading und hohe gleichzeitige Programmierung erhalten immer mehr Aufmerksamkeit und Aufmerksamkeit.

    1. Vollständige Nutzung der CPU-Ressourcen

    Aus der obigen Einführung von CPU ist ersichtlich, dass es keinen CPU-Kernel auf dem Markt gibt, der den Multithread-Parallelitätsmechanismus nicht verwendet, insbesondere wenn der Server hat mehr als eine CPU. Die grundlegende Planungseinheit eines Programms ist ein Thread. Ein Thread kann nur in einem Thread eines Kerns einer CPU ausgeführt werden. Wenn Sie über eine i3-CPU verfügen, ist die Rechenleistung von zwei Kernen und vier Threads das Schlimmste. Wenn es sich um einen Thread handelt, werden 3/4 der CPU-Leistung verschwendet: Wenn Sie einen Multi-Thread entwerfen, kann dieser auf mehreren Threads mehrerer Kerne mehrerer CPUs gleichzeitig ausgeführt werden, wodurch die CPU voll ausgenutzt und reduziert wird die Leerlaufzeit der CPU, nutzen ihre Rechenleistung und erhöhen die Parallelität.

    2. Beschleunigen Sie die Reaktionszeit der Benutzer.

    Zum Beispiel die Download-Funktion, die wir häufig verwenden, eröffnen viele Freunde eine bestimmte Mitgliedschaft, da die Mitgliedschaftsversion das Herunterladen mehrerer Threads ermöglicht und niemand es ertragen kann, in einem Thread herunterzuladen , Warum? Weil Multithread-Downloads schnell sind.

    Bei der Programmentwicklung wird die Webseitengeschwindigkeit um 1 Sekunde erhöht. Wenn die Anzahl der Benutzer groß ist, kann dies die Anzahl der Conversions erhöhen. Auf den Webseiten, die wir häufig durchsuchen, öffnet der Browser beim Laden der Seite einige weitere Threads, um Netzwerkressourcen zu laden und die entsprechende Geschwindigkeit der Website zu verbessern. Multithreading und hohe Parallelität sind in Computern allgegenwärtig.

    3. Gestalten Sie den Code modular, asynchron und einfach.

    Wenn wir beispielsweise ein E-Commerce-Projekt durchführen, können das Aufgeben einer Bestellung und das Versenden von Textnachrichten und E-Mails an Benutzer in zwei Teile aufgeteilt werden: Textnachrichten und E-Mails . Die Schritte werden in zwei separate Module aufgeteilt und zur Ausführung an andere Threads übergeben. Dies erhöht nicht nur die asynchronen Vorgänge, verbessert die Systemleistung, sondern macht das Programm auch modular, übersichtlich und einfach.

    6. Vorsichtsmaßnahmen für Multithreading

    1. Sicherheit zwischen Threads

    Mehrere Threads im selben Prozess teilen sich Ressourcen, das heißt, sie können alle auf eine Variable in derselben Speicheradresse zugreifen.

    Zum Beispiel: Wenn es in jedem Thread nur Lesevorgänge für globale Variablen und statische Variablen gibt, aber keine Schreibvorgänge, ist diese globale Variable im Allgemeinen threadsicher, wenn mehrere Threads gleichzeitig Schreibvorgänge ausführen ist im Allgemeinen erforderlich. Berücksichtigen Sie die Thread-Synchronisation, da sonst die Thread-Sicherheit beeinträchtigt werden kann.

    2. Deadlock zwischen Threads

    Um das Sicherheitsproblem zwischen Threads zu lösen, wird der Java-Sperrmechanismus eingeführt. Wenn Sie jedoch nicht aufpassen, tritt das Multithreading-Problem des Java-Thread-Deadlocks auf Warten auf Sperren, die überhaupt nicht freigegeben werden können, was dazu führt, dass alle Arbeiten nicht abgeschlossen werden.

    Angenommen, es gibt zwei hungrige Menschen, sie müssen sich ein Messer und eine Gabel teilen und abwechselnd essen, sie müssen beide zwei Schlösser besorgen, sich das Messer und die Gabel teilen. Angenommen, Thread A bekommt das Messer und Thread B bekommt die Gabel. Thread A wechselt in den Blockierungszustand und wartet auf die Gabelung, während Thread B auf das Messer wartet, das Thread A gehört. Dies ist nur ein erfundenes Beispiel, und obwohl es zur Laufzeit schwer zu erkennen ist, kommt es immer wieder zu einer solchen Situation.

    3. Zu viele Threads erschöpfen die Dienstressourcen und verursachen einen Absturz.

    Zu viele Threads können dazu führen, dass das System eine große Anzahl von Threads erstellt, was den Systemspeicher und die „Übergangsumschaltung“ der CPU verursacht Wie können wir ein solches Problem lösen, wenn der Computer abstürzt?

    Einige Systemressourcen sind begrenzt, z. B. Dateibeschreibungen. Bei Multithread-Programmen können die Ressourcen ausgehen, da jeder Thread möglicherweise eine solche Ressource benötigt. Wenn die Anzahl der Threads recht groß ist oder die Anzahl der Kandidaten-Threads für eine Ressource die Anzahl der verfügbaren Ressourcen bei weitem übersteigt, ist es am besten, einen Ressourcenpool zu verwenden. Eines der besten Beispiele ist das Datenbankverbindungspooling. Immer wenn ein Thread eine Datenbankverbindung verwenden muss, entnimmt er eine aus dem Pool und gibt sie nach der Verwendung an den Pool zurück. Ressourcenpool wird auch Ressourcenbibliothek genannt.

    Bei der Entwicklung von Multithread-Anwendungen gibt es viele Dinge zu beachten. Ich hoffe, dass jeder die Gefahren bei zukünftigen Arbeiten langsam verstehen kann.

    7. Hinweise zum Multithreading

    Threads arbeiten zusammen, um eine bestimmte Arbeit abzuschließen. Beispiel: Ein Thread ändert den Wert eines Objekts, und ein anderer Thread erkennt die Änderung und führt dann den entsprechenden Vorgang aus mit einem Thread, und die endgültige Ausführung ist ein weiterer Thread. Ersteres ist der Produzent und letzteres ist der Verbraucher. Dieses Modell isoliert „Was“ und „Wie“. . Wenn die Bedingungen erfüllt sind, verlassen Sie die while-Schleife, um die Arbeit des Verbrauchers abzuschließen.

    Es gibt jedoch folgende Probleme:

    • Es ist schwierig, die Aktualität sicherzustellen.

    • Es ist schwierig, die Ausgaben zu senken. Wenn die Ruhezeit verkürzt wird, beispielsweise auf 1 Millisekunde, können Verbraucher Änderungen in den Bedingungen schneller erkennen, es werden jedoch möglicherweise mehr Prozessorressourcen beansprucht, was zu unnötiger Verschwendung führt.

    Warte-/Benachrichtigungsmechanismus: bedeutet, dass ein Thread A die Methode wait() von Objekt O aufruft und in den Wartezustand wechselt, während ein anderer Thread B die Methode notify() oder notifyAll() von Objekt O aufruft. Thread A Kehren Sie nach Erhalt der Benachrichtigung von der Methode wait () des Objekts O zurück, um nachfolgende Vorgänge auszuführen. Die beiden oben genannten Threads vervollständigen die Interaktion über das Objekt O, und die Beziehung zwischen wait () und notify/notifyAll () für das Objekt ähnelt einem Schaltsignal, das verwendet wird, um die Interaktion zwischen der wartenden Partei und der benachrichtigenden Partei abzuschließen.

    notify(): Benachrichtigen Sie einen Thread, der auf das Objekt wartet, um von der Wartemethode zurückzukehren. Die Voraussetzung für die Rückkehr ist, dass der Thread die Sperre des Objekts erhält und der Thread, der die Sperre nicht erhält, erneut in den Wartezustand wechselt .

    notifyAll(): Benachrichtigen Sie alle Threads, die auf das Objekt warten.

    wait(): Der Thread, der diese Methode aufruft, wechselt in den Status WAITING und kehrt nur zurück, wenn er auf eine Benachrichtigung von einem anderen Thread wartet oder unterbrochen wird Beachten Sie, dass nach dem Aufruf der Methode wait() die Sperre des Objekts aufgehoben wird.

    wait(long): Timeout und Wartezeit beträgt hier Millisekunden, was bedeutet, dass bis zu n Millisekunden gewartet werden müssen.

    wait (long, int): Für eine detailliertere Steuerung des Timeouts können Nanosekunden erreicht werden.

    Das Standardparadigma des Wartens und der Benachrichtigung folgt den folgenden Prinzipien.

    • Holen Sie sich die Sperre des Objekts.

    • Wenn die Bedingung nicht erfüllt ist, rufen Sie die wait()-Methode des Objekts auf und überprüfen Sie die Bedingung nach der Benachrichtigung trotzdem.

    • Wenn die Bedingungen erfüllt sind, wird die entsprechende Logik ausgeführt.

    Gemeinsam genutzte Multithread-Variablen und Kollaborationsmechanismus in Java

    Der Melder folgt den folgenden Prinzipien:

    • Erhalten Sie die Sperre des Objekts.

    • Bedingungen ändern.

    • Benachrichtigen Sie alle Threads, die auf das Objekt warten.

    Gemeinsam genutzte Multithread-Variablen und Kollaborationsmechanismus in Java

    Bevor die Methoden der Serien wait () und notify () aufgerufen werden, muss der Thread die Sperre des Objekts auf Objektebene erhalten, dh die Methode wait () und notify () können nur aufgerufen werden Bei einer synchronisierten Methode oder einem synchronisierten Block gibt der aktuelle Thread die Sperre frei. Bevor er von wait() zurückkehrt, konkurriert der Thread mit anderen Threads, um die Sperre wiederherzustellen () Eine Reihe von Methoden verlässt den synchronisierten Codeblock, der notifyAll aufruft. Danach konkurrieren sie. Wenn einer der Threads die Objektsperre erhält, wird er weiterhin ausgeführt. Nachdem er den synchronisierten Codeblock verlassen und die Sperre aufgehoben hat, konkurrieren andere Threads, die aktiviert wurden, weiterhin um die Sperre und fahren fort, bis alle aktivierten Threads aktiviert sind haben die Ausführung abgeschlossen.

    Wer sollte notify und notifyAll verwenden?

    Verwenden Sie notifyAll() so oft wie möglich, verwenden Sie notify() mit Vorsicht, da notify() nur einen Thread aufweckt und wir nicht sicherstellen können, dass der Thread aufgeweckt werden muss sei der Faden, den wir zum Aufwachen brauchen.

    Das obige ist der detaillierte Inhalt vonGemeinsam genutzte Multithread-Variablen und Kollaborationsmechanismus in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen