1. Was ist Thread-Synchronisation und Asynchronität?
(Empfehlungen für weitere Interviewfragen: Java-Interviewfragen )
Synchronisation (synchron) ist ein koordiniertes Tempo, das in einer vorgegebenen Reihenfolge abläuft.
Asynchron ist das Gegenteil von Synchronisation, es blockiert nicht und läuft gleichzeitig.
2. Was ist Thread unsicher? Wie kann man es lösen? (Wichtige Punkte)
Was ist Thread-Sicherheit?
Wenn in dem Prozess, in dem sich Ihr Code befindet, mehrere Threads gleichzeitig ausgeführt werden, führen diese Threads diesen Code möglicherweise gleichzeitig aus. Wenn die Ergebnisse jedes Laufs mit denen von Single-Thread-Läufen übereinstimmen und die Werte anderer Variablen mit den Erwartungen übereinstimmen, ist dies Thread-sicher.
Mit anderen Worten: Die von einer Klasse oder einem Programm bereitgestellte Schnittstelle ist eine atomare Operation für Threads oder das Umschalten zwischen mehreren Threads führt nicht zu Mehrdeutigkeiten in den Ausführungsergebnissen der Schnittstelle, was bedeutet, dass wir keine Synchronisierung in Betracht ziehen müssen Probleme.
Thread-Sicherheitsprobleme werden durch globale Variablen und statische Variablen verursacht.
Wenn in jedem Thread nur Lesevorgänge für globale Variablen und statische Variablen, aber keine Schreibvorgänge vorhanden sind, ist diese globale Variable im Allgemeinen threadsicher, wenn mehrere Threads im Allgemeinen gleichzeitig Schreibvorgänge ausführen Die Thread-Synchronisation muss berücksichtigt werden, da sonst die Thread-Sicherheit beeinträchtigt werden kann.
(Verwandte Tutorials empfohlen: Java-Eingabeprogramm)
Warum ist ArrayList threadunsicher? Warum es verwenden, wenn es nicht sicher ist? Wie kann die Thread-Unsicherheit behoben werden?
Eine ArrayList kann in zwei Schritten vervollständigt werden:
1. Speichern Sie dieses Element am Speicherort von Items[Size]; 2. Erhöhen Sie den Wert für Größe.
Wenn im Fall eines Single-Thread-Betriebs Size = 0 ist, befindet sich das Element nach dem Hinzufügen an Position 0 und Size = 1, und wenn es beispielsweise Multi-Threaded ist, gibt es diese Bei zwei Threads speichert Thread A das Element zunächst an Position 0.
Aber zu diesem Zeitpunkt plant die CPU, Thread A anzuhalten, und Thread B erhält die Chance, ausgeführt zu werden. Thread B fügt dieser ArrayList auch Elemente hinzu, da Size zu diesem Zeitpunkt immer noch gleich 0 ist (beachten Sie, dass wir davon ausgehen, dass das Hinzufügen eines Elements zwei Schritte erfordert und Thread A nur Schritt 1 abgeschlossen hat), sodass Thread B auch Elemente zu Stored at hinzufügt Standort 0. Dann werden sowohl Thread A als auch Thread B weiter ausgeführt, wobei beide den Wert von Size erhöhen.
Okay, schauen wir uns nun die ArrayList-Situation an. Es gibt tatsächlich nur ein Element, das an Position 0 gespeichert ist, aber Size ist gleich 2. Das ist „Thread unsicher“.
Wie kann man es lösen?
Sperre (Objektsperre, Sperrcodeblock), Spin + CAS-Methode (optimistische Sperre), verwenden Sie die von Java bereitgestellte threadsichere Datenklasse
3 So erstellen Sie eine Faden? Wie viele Methoden gibt es?1. Erben Sie die Thread-Klasse
2. Implementieren Sie die Runnable-Schnittstelle
Viertens: Verwenden Sie Runnalbe. Ist die Schnittstelle gut? Oder ist es besser, die Thread-Klasse zu erben?
Es ist besser, die Runnable-Schnittstelle zu implementieren.1. Weil durch die Implementierung der Runnable-Schnittstelle die Einschränkungen der Java-Einzelvererbung vermieden werden können.
Wenn eine Klasse Thread erbt, kann sie keine anderen Klassen erben. Und wenn eine Klasse Runnable implementiert, kann sie auch von anderen Klassen erben. 2. Mehr im Einklang mit dem objektorientierten Design Die Funktion der run()-Methode besteht darin, den vom Thread auszuführenden Code zu kapseln. Dann ist das Objekt, zu dem die run()-Methode gehört, das Thread-Task-Objekt. Unterklassenobjekte der Thread-Klasse sind sowohl Thread-Objekte als auch Thread-Aufgabenobjekte. Die Kopplung ist sehr stark. Mit der Runnable-Schnittstelle können Thread-Aufgaben und Threads entkoppelt werden, wodurch die Skalierbarkeit des Programms verbessert wird. (Empfohlene verwandte Video-Tutorials:Java-Video-Tutorial
)5. Was ist der Unterschied zwischen sleep() und wait()?
sleep ist eine Methode der Thread-Klasse (Thread), die bewirkt, dass dieser Thread die Ausführung für eine bestimmte Zeit anhält und anderen Threads Ausführungsmöglichkeiten gibt, aber der Überwachungsstatus bleibt weiterhin erhalten und wird nach Ablauf der Zeit automatisch wieder aufgenommen ist oben. Durch den Aufruf von Sleep wird die Objektsperre nicht aufgehoben.Wait ist eine Methode der Object-Klasse. Der Aufruf der Wait-Methode für dieses Objekt führt dazu, dass dieser Thread die Objektsperre aufgibt und in den Wartesperrenpool eintritt, der auf dieses Objekt wartet ) für dieses Objekt ausgegeben wird, kann dieser Thread den Objektsperrenpool betreten und sich darauf vorbereiten, die Objektsperre zu erhalten und in den Ausführungsstatus zu wechseln.
Wenn die Variable als flüchtig deklariert ist, ist sie bei jedem Zugriff mit dem Hauptspeicher konsistent, wenn auf die Variable in einer synchronisierten Methode oder einem synchronisierten Block zugegriffen wird, wenn die Sperre am Eingang des erreicht wird Methode oder Block und die Methode oder der Block Die Variablen werden synchronisiert, wenn die Sperre beim Beenden aufgehoben wird.Das obige ist der detaillierte Inhalt vonSammlung klassischer Java-Interviewfragen (5). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!