Denken Sie zurück, als ein Computer nur eine CPU hatte und jeweils nur ein Programm verarbeiten konnte. Dann kam Multitasking auf, was bedeutete, dass Computer mehrere Programme gleichzeitig ausführen konnten. Obwohl es nicht wirklich „gleichzeitig“ ist. Eine einzelne CPU wird von den Programmen gemeinsam genutzt. Das Betriebssystem wechselt zwischen laufenden Programmen und führt eines davon eine Weile aus, bevor es umschaltet.
Mit dem Aufkommen von Multitasking stellt es eine neue Herausforderung für Softwareentwickler dar. Programme können nicht davon ausgehen, dass jederzeit die gesamte CPU oder der gesamte Arbeitsspeicher und andere Computerressourcen verfügbar sind. Ein gutes Programm sollte alle Ressourcen, die es nicht mehr nutzt, freigeben, damit andere Programme sie nutzen können.
Später erschien Multithreading, was bedeutet, dass Sie mehrere Threads im selben Programm ausführen können. Ein Thread kann als eine CPU betrachtet werden, die ein Programm ausführt. Wenn mehrere Threads im selben Programm ausgeführt werden, ist es so, als ob mehrere CPUs dasselbe Programm ausführen würden.
Mehrere Threads können eine großartige Möglichkeit sein, die Leistung einiger Programmtypen zu steigern. Allerdings ist Multithreading eine noch größere Herausforderung als Multitasking. Dieser Thread wird im selben Programm ausgeführt und liest und schreibt gleichzeitig denselben Speicher. Dies kann zu Fehlern führen, die in einzelnen Threads nicht auftreten. Einige dieser Fehler treten möglicherweise nicht auf Maschinen mit einer CPU auf, da die beiden Threads nie gleichzeitig ausgeführt werden. Moderne Computer verfügen alle über Multi-Core-CPUs, und es gibt sogar mehrere CPU-Typen. Dies bedeutet, dass separate Threads gleichzeitig von separaten Kernen oder CPUs ausgeführt werden können.
Wenn ein Thread eine Speichereinheit liest und ein anderer Thread darauf schreibt, welchen Wert liest der erste Thread am Ende? Lohnt sich dieser alte? Oder der vom zweiten Thread geschriebene Wert? Oder handelt es sich um einen Hybridwert zwischen beiden? Oder wenn zwei Threads gleichzeitig an denselben Speicherort schreiben, welcher Wert bleibt dann übrig, wenn sie fertig sind? Vom ersten Thread geschriebener Wert? Wert über zweiten Thread geschrieben? Oder handelt es sich um einen Mischwert?
Ohne entsprechende Sicherheitsmaßnahmen ist jeder dieser Ausgänge möglich. Dieses Verhalten ist sogar unvorhersehbar. Diese Ausgabe kann sich jederzeit ändern. Als Entwickler ist es daher wichtig zu wissen, wie man die richtigen Schutzmaßnahmen einsetzt – das bedeutet, dass man lernen muss, zu kontrollieren, wie Threads auf gemeinsam genutzte Ressourcen wie Speicher, Dateien, Datenbanken usw. zugreifen. Das ist eines der Themen in diesem Java-Parallelitäts-Tutorial.
Multi-Threading und Parallelität in Java
Java war die erste Sprache, die Multi-Threading einfach und benutzerfreundlich für Entwickler machte. Java verfügte von Anfang an über Multithreading-Fähigkeiten. Daher werden Java-Entwickler häufig mit den oben beschriebenen Problemen konfrontiert. Aus diesem Grund habe ich eine Reihe von Artikeln über Java-Parallelität geschrieben. Genau wie ich wird wahrscheinlich jeder andere Java-Entwickler davon profitieren.
In dieser Serie geht es hauptsächlich um Java-Multithreading, aber einige der Probleme, die beim Multithreading auftreten, ähneln denen, die beim Multitasking und bei verteilten Systemen auftreten. Auch Multitasking und verteilte Systeme können in dieser Reihe erwähnt werden. Beim Wort „Parallelität“ geht es also nicht nur um Multithreading.
Java-Parallelität im Jahr 2015 und darüber hinaus
Seit das erste Java-Parallelitätsbuch geschrieben wurde, gibt es in der Welt der Java-Parallelitäts-Frameworks und -Designs viel Dies ist bereits seit der Veröffentlichung der Java 5-Parallelitätstools geschehen.
Neue, asynchrone „Shared Nothing“-Plattformen und APIs wie Vert.x und Play/Akka und Qbit sind entstanden. Diese Plattformen verwenden andere Parallelitätsmodelle als das Standard-Java-Parallelitätsmodell für Threads, gemeinsam genutzten Speicher und Sperren. Neue nicht blockierende Parallelitätsalgorithmen wurden veröffentlicht und neue nicht blockierende Parallelitätstools wie LMAX Disrupter wurden zu unserem Toolkit hinzugefügt.
Angesichts dieser neuen Entwicklungen ist es auch für mich an der Zeit, das Java Concurrency Tutorial zu aktualisieren. Daher wird dieses Tutorial noch einmal überarbeitet. Neue Tutorials werden veröffentlicht, wann immer Zeit zum Schreiben vorhanden ist.
Das Obige ist die Einführung in 1. Java-Parallelität/Multithreading. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).