Heim  >  Artikel  >  Java  >  Parallelität in Java

Parallelität in Java

PHPz
PHPzOriginal
2024-08-30 16:18:26297Durchsuche

In der heutigen Welt entwickelt sich alles rasant. Es gibt immer Raum für Verbesserungen in allem und jedem. Das ist auch bei unserer Programmiersprache der Fall. Mit unseren modernen Technologien erwarten wir heute, dass Dinge einfach und schnell erledigt werden können. Um mehrere Dinge gleichzeitig zu erledigen, entstand das Konzept der Parallelität. Was ist also Parallelität, ihre Verwendung, warum wird sie benötigt und vieles mehr? Wir werden versuchen, solche Fragen anzusprechen und in diesem Artikel einzeln zu beantworten. Bringen wir unsere Diskussion also zu einem sehr grundlegenden gemeinsamen Abschnitt: der Definition von Parallelität. In diesem Thema erfahren wir, was Parallelität in Java ist.

Parallelität in Java

Starten Sie Ihren kostenlosen Softwareentwicklungskurs

Webentwicklung, Programmiersprachen, Softwaretests und andere

Definition von Parallelität?

Was ist also Parallelität eigentlich? Um das zu beantworten, nehmen wir ein allgemeines Szenario. Angenommen, Sie versuchen beim Lesen dieses Artikels, mehrere Dinge gleichzeitig zu tun. Vielleicht versuchen Sie, sich eine Notiz zu machen, oder vielleicht versuchen Sie, es zu verstehen oder über etwas nachzudenken. Vereinfacht ausgedrückt versuchen Sie also, mehrere Dinge parallel zu erledigen. Das ist es, was Parallelität bedeutet. Unter Parallelität versteht man einfach die parallele Ausführung mehrerer Aufgaben. Wir werden in diesem Artikel Parallelität im Rahmen von Java als Programmiersprache diskutieren.

Lassen Sie uns in der Zwischenzeit eine grundlegende Definition von Thread haben. Tatsächlich ist es in Java oder allgemein in jeder Programmiersprache der Thread, der für die Durchführung der Parallelität verantwortlich ist. Die grundlegende Rolle dieser Threads besteht darin, die parallele Ausführung von Aufgaben zu erleichtern.

Was ist also ein Thread?

Ein Thread ist ein einfacher Prozess mit einem eigenen Aufrufstapel. Ein Thread kann jedoch auf gemeinsam genutzte Daten von anderen Threads zugreifen, die unter demselben Prozess ausgeführt werden. Wir können viele Threads innerhalb einer Java-Anwendung verwenden, um Parallelverarbeitung oder Parallelität zu erreichen.

Lassen Sie uns nun zu unserem nächsten Thema übergehen, nämlich …

Parallelität in der Java-Definition?

Alle OOP-Sprachen verfügen also über ein Threading-Konzept in Java oder einer anderen Programmiersprache wie C#. In Java haben wir verschiedene Prozesse, die durch die Erstellung unterschiedlicher Threads ausgeführt werden, um Parallelität zu erreichen.

Lassen Sie uns nach dieser einfachen Definition unser neues Thema besprechen, nämlich:

Was macht Java-Anwendungen gleichzeitig aus?

Die erste Klasse, die man benötigt, um eine Java-Anwendung parallel zu machen, ist die Klasse java.lang.Thread. Die Klasse Java.lang.Thread ist für alle Parallelitätskonzepte in der Programmiersprache Java verantwortlich. Danach haben wir die java.lang.Runnable-Schnittstelle, um das Thread-Verhalten aus der Thread-Klasse zu abstrahieren.

Andere Klassen, in denen wir eine erweiterte Anwendung erstellen müssen, werden aus dem in Java 1.5 hinzugefügten Paket java.util.concurrent verwendet.

Damit sind wir bei einer neuen Frage angelangt, die lautet...

Ist Java Concurrency wirklich so einfach?

Es scheint, dass die Implementierung von Parallelität in Java recht einfach ist. Allerdings ist es wirklich nicht so. Lassen Sie uns dafür sorgen.

Unsere obige Diskussion erweckt im Allgemeinen den Eindruck, dass Parallelität ein einfaches, gutes Konzept und recht einfach zu implementieren ist. Angenommen, wir überwachen es besser und versuchen, es zu verstehen. In diesem Fall ist ein gutes Verständnis der Grundkonzepte und ein gründliches Verständnis dessen erforderlich, was wir erreichen müssen.

Vergleichen wir gleichzeitige Anwendungen und Single-Threaded-Anwendungen. Wir sind im Allgemeinen der Meinung, dass eine gleichzeitige Anwendung hinsichtlich Design und Verständnis komplex ist. Von mehreren Threads ausgeführter Code erfordert besondere Aufmerksamkeit und Ressourcen für den Zugriff auf gemeinsam genutzte Daten. Fehler, die aufgrund einer falschen Thread-Synchronisierung auftreten, sind schwer zu debuggen und zu beheben. Außerdem werden diese Fehler in den meisten Szenarien nicht in der Anfangsphase erkannt; Es wird im Produktmodus erkannt, was noch schwieriger zu reproduzieren ist.

Abgesehen von Fehlern und häufigen Defekten erfordern gleichzeitige Threads mehr Ressourcen, um die Anwendung auszuführen.

Probleme und Verbesserungen bei der Parallelität – Erklärung mit Beispiel

Grundsätzlich gibt es zwei Arten von Problemen, die aufgrund der Parallelität auftreten. Diese Probleme können grob in zwei Kategorien eingeteilt werden

  • Thread-Interferenzfehler
  • Speicherkonsistenzfehler

Lassen Sie uns jeden einzelnen verstehen.

Thread-Interferenzfehler

Lassen Sie es uns anhand eines einfachen Beispiels verstehen.

Angenommen, wir haben eine Zählerfunktion, deren grundlegende Aufgabe darin besteht, den Zähler oder die Anzahl einer Zahl zu erhöhen. Angenommen, wir haben Thread A und Thread B und Thread A liest den Anfangswert als 0. Nun werden die folgenden Schritte nacheinander ausgeführt.

  1. Thread A liest den Anfangswert als 0
  2. Thread B liest den Anfangswert als 0
  3. Thread A erhöht den Wert um 1. Der neue Wert ist jetzt 1
  4. Thread B erhöht parallel dazu auch den Wert auf 1.
  5. Thread A schreibt einen aktualisierten Wert, der 1 ist, in die Speicherzelle
  6. Thread B wiederholt ebenfalls den gleichen Schritt, wobei der aktualisierte Wert 1 in die Speicherzelle geschrieben wird

Hier tritt also das Problem auf. Zwei Threads, A und B, führen den Code zweimal aus, und der erwartete Wert ist 2, wird jedoch als 1 wiedergegeben. Dies ist das Hauptproblem, das mehrere Threads verursachen können.

Wie könnte das gelöst werden?

Thread-Interferenzfehler können durch Synchronisieren des Zugriffs auf gemeinsam genutzte Variablen behoben werden. Wir müssen mit den aktualisierten Werten zwischen den gemeinsam genutzten Daten synchron bleiben.

Lassen Sie uns nun einen Blick auf die zweite Art von Fehler werfen …

Speicherkonsistenzfehler

Speicherinkonsistenzfehler treten im Allgemeinen auf, wenn verschiedene Threads versuchen, dasselbe Datenelement zu lesen oder inkonsistente Ansichten darauf haben. Dies geschieht normalerweise, wenn der erste Thread einige gemeinsam genutzte Daten aktualisiert. Dieser aktualisierte Wert wird nicht an zweite oder andere Threads weitergegeben und diese lesen alte Daten.

Mal sehen, warum das passiert.

Nun, dafür kann es viele Ursachen geben. Normalerweise führt der Compiler im Allgemeinen mehrere Optimierungen an der Anwendung durch, um die Leistung zu verbessern. Es kann auch Befehlssequenzen aktualisieren, um die Leistung zu optimieren. Auch generell versuchen Prozessoren, Codes zu optimieren; Beispielsweise könnte eine CPU den aktuellen Wert einer Variablen aus dem Cache-Speicher oder einem temporären Register statt aus dem Hauptspeicher lesen.

Fazit

Parallelität ist ein sehr wichtiges Merkmal jeder OOP-Sprache. Durch Threading können wir mehrere Prozesse parallel ausführen. Es hilft uns, unsere komplexen Aufgaben schneller auszuführen. Vorteile: Parallelität hat jedoch auch einige Nachteile. Die Verwendung von Threading verursacht einen hohen Ressourcenverbrauch.

Das obige ist der detaillierte Inhalt vonParallelität in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn