Grundlegende Fragen und Antworten zu Java

57. Der Umfang der verschiedenen Sperrszenarien von synchronisiert

1. Bei nicht statischen Methoden ist die Objektinstanz (diese) gesperrt, und jede Objektinstanz verfügt über eine Sperre.

öffentliche synchronisierte void-Methode() {}


2. Bei der statischen Methode wird das Klassenobjekt der Klasse gesperrt, da die relevanten Daten der Klasse im Metaspace der permanenten Generierung gespeichert werden und der Metaspace global gemeinsam genutzt wird, sodass die Sperre der statischen Methode a entspricht Globale Sperre der Klasse, die alle Threads sperrt, die diese Methode aufgerufen haben.

öffentliche statische synchronisierte void-Methode() {}


3. Bei Lock.class wird das Klassenobjekt von Lock gesperrt, und es gibt global nur eines.

synchronisiert (Lock.class) {}


4. Daraufhin wird die Objektinstanz gesperrt und jede Objektinstanz verfügt über eine Sperre.

synchronisiert (dies) {}


5. Bei der Arbeit mit statischen Mitgliedsvariablen ist das Objekt der statischen Mitgliedsvariablen gesperrt. Da es sich um eine statische Variable handelt, gibt es global nur eine.

öffentlicher statischer Objektmonitor = new Object(); synchronisiert (Monitor) {}

         

59. Wie kann ein Deadlock verhindert werden?
Um einen Deadlock zu verhindern, muss eine der vier notwendigen Bedingungen außer Kraft gesetzt werden.

1) Brechen Sie die Bedingung des gegenseitigen Ausschlusses: Heben Sie den gegenseitigen Ausschluss im System auf. Wenn die Ressource nicht ausschließlich von einem Prozess verwendet wird, kommt es definitiv nicht zu einem Deadlock. Aber im Allgemeinen kann unter den vier aufgeführten Bedingungen die „gegenseitig ausschließende“ Bedingung nicht gebrochen werden. Daher geht es bei der Deadlock-Verhinderung hauptsächlich darum, mehrere andere notwendige Bedingungen zu zerstören, und nicht um die Zerstörung von Bedingungen für den „gegenseitigen Ausschluss“. .

2) Brechen Sie die Anforderungs- und Haltebedingungen: 1) Übernehmen Sie die Ressourcen-Vorzuweisungsstrategie , das heißt, wenden Sie sich für alle Ressourcen an, bevor der Prozess ausgeführt wird, und führen Sie ihn aus, wenn er erfüllt ist, oder warten Sie. 2) Bevor jeder Prozess einen neuen Ressourcenantrag stellt, muss er zunächst die zuvor belegten Ressourcen freigeben.

3) Brechen Sie die unveräußerliche Bedingung: Wenn ein Prozess bestimmte Ressourcen belegt und weiterhin andere Ressourcen beantragt, aber nicht erfüllt werden kann, muss der Prozess die ursprünglich belegten Ressourcen freigeben.

4) Unterbrechen Sie die Wartebedingung der Schleife: Implementieren Sie eine geordnete Ressourcenzuweisungsstrategie und nummerieren Sie alle Ressourcen im System einheitlich . Alle Prozesse können Ressourcen nur in Form steigender Seriennummern beantragen.        

60. Warum einen Thread-Pool verwenden? Ist es nicht bequem, direkt einen neuen Thread zu erstellen?


Wenn wir in der zu verarbeitenden Methode direkt einen neuen Thread erstellen und diese Methode häufig aufruft, werden viele Threads erstellt, was nicht nur Systemressourcen verbraucht, sondern auch die Stabilität des Systems verringert. Wenn das System versehentlich abstürzt, Sie können zur Prüfung direkt auf „Finanzen“ gehen.

Wenn wir den Thread-Pool sinnvoll nutzen, können wir das Dilemma eines Systemabsturzes vermeiden. Im Allgemeinen kann die Verwendung des Thread-Pools folgende Vorteile bringen:

  1. Reduzieren Sie den Ressourcenverbrauch . Reduzieren Sie die Kosten für die Erstellung und Zerstörung von Threads, indem Sie erstellte Threads wiederverwenden.
  2. Verbessern Sie die Reaktionsfähigkeit . Wenn eine Aufgabe eintrifft, kann die Aufgabe sofort ausgeführt werden, ohne auf die Erstellung des Threads warten zu müssen.
  3. Erhöhen Sie die Verwaltbarkeit von Threads . Threads sind knappe Ressourcen und Thread-Pools können für eine einheitliche Zuweisung, Optimierung und Überwachung verwendet werden.

61. Was sind die Kernattribute des Thread-Pools?

threadFactory (Thread-Factory): Die Factory, die zum Erstellen von Arbeitsthreads verwendet wird. ? ? ?

corePoolSize (Anzahl der Kernthreads): Wenn im Thread-Pool weniger Threads ausgeführt werden als corePoolSize, wird ein neuer Thread erstellt, um die Anforderung zu verarbeiten, auch wenn andere Arbeitsthreads inaktiv sind.

workQueue (Warteschlange) : Eine blockierende Warteschlange, in der Aufgaben gespeichert und an Arbeitsthreads übergeben werden .

MaximumPoolSize (maximale Anzahl von Threads): Die maximale Anzahl von Threads, die vom Thread-Pool geöffnet werden dürfen.

Handler (Ablehnungsstrategie) : Beim Hinzufügen von Aufgaben zum Thread-Pool wird die Ablehnungsstrategie in den folgenden zwei Situationen ausgelöst: 1 ) Der Betriebsstatus des Thread-Pools ist nicht RUNNING ; 2) Wenn der Thread-Pool die maximale Anzahl erreicht hat Anzahl der Threads und die Blockierungswarteschlange ist voll.

keepAliveTime (Keep Alive Time ): Wenn die aktuelle Anzahl der Threads im Thread-Pool corePoolSize überschreitet, werden die redundanten Threads beendet, wenn die Leerlaufzeit keepAliveTime überschreitet.

62. Sprechen Sie über den Betriebsprozess des Thread-Pools.


 

63. Welche Ablehnungsstrategien hat der Thread-Pool?


AbortPolicy: Abbruchrichtlinie. Die Standard-Ablehnungsstrategie löst direkt eine RejectedExecutionException aus. Der Aufrufer kann diese Ausnahme abfangen und seinen eigenen Verarbeitungscode entsprechend seinen Anforderungen schreiben.

DiscardPolicy: Richtlinie verwerfen. Tun Sie nichts und verwerfen Sie die abgelehnte Aufgabe einfach .

DiscardOldestPolicy: Die älteste Richtlinie verwerfen . Das Verwerfen der ältesten Aufgabe in der Blockierungswarteschlange entspricht der Ausführung der nächsten Aufgabe in der Warteschlange und dem anschließenden erneuten Senden der abgelehnten Aufgabe. Wenn es sich bei der blockierenden Warteschlange um eine Prioritätswarteschlange handelt, führt die Strategie „Älteste verwerfen“ dazu, dass die Aufgaben mit der höchsten Priorität verworfen werden. Daher ist es am besten, diese Strategie nicht mit Prioritätswarteschlangen zu verwenden.

CallerRunsPolicy : Anrufer-Ausführungsrichtlinie. Führen Sie die Aufgabe im Aufrufer-Thread aus. Diese Strategie implementiert einen Anpassungsmechanismus. Diese Strategie bricht die Aufgabe weder ab noch löst sie eine Ausnahme aus , sondern setzt die Aufgabe auf den Aufrufer (den Hauptthread, der den Thread-Pool aufruft, um die Aufgabe auszuführen) zurück . Da dies eine gewisse Zeit in Anspruch nimmt Führen Sie die Aufgabe aus, sodass der Hauptthread für mindestens einen bestimmten Zeitraum keine Aufgaben senden kann, sodass der Thread-Pool Zeit hat, die ausgeführten Aufgaben zu verarbeiten.
 

70. Was ist der Unterschied zwischen List, Set und Map?


Liste (ein guter Helfer beim Umgang mit Ordnung): Die List-Schnittstelle speichert eine Reihe nicht eindeutiger (mehrere Elemente können auf dasselbe Objekt verweisen), geordneter Objekte.

Festlegen (Fokus auf eindeutige Eigenschaften): Doppelte Sammlungen sind nicht zulässig und mehrere Elemente verweisen nicht auf dasselbe Objekt.

Karte (professionelle Benutzer, die Schlüssel zum Suchen verwenden): Verwenden Sie Schlüssel-Wert-Paare zum Speichern. Map behält den mit Key verknüpften Wert bei. Zwei Schlüssel können auf dasselbe Objekt verweisen, der Schlüssel kann jedoch nicht wiederholt werden. Ein typischer Schlüssel ist vom Typ String, kann aber auch ein beliebiges Objekt sein.

/*
1. Es gibt eine einzelne Vererbung zwischen Klassen. Es gibt nur eine direkte Elternklasse.
2. Es gibt mehrere Implementierungen zwischen Klassen und Schnittstellen. Eine Klasse kann mehrere Schnittstellen implementieren.
3. Es gibt eine Mehrfachvererbung zwischen Schnittstellen.
 
Hinweise:
1. Es spielt keine Rolle, ob die abstrakten Methoden in mehreren übergeordneten Schnittstellen wiederholt werden .
2. Wenn die Standardmethode in mehreren übergeordneten Schnittstellen wiederholt wird, muss die Unterschnittstelle die Standardmethode [und mit dem Standardschlüsselwort] überschreiben.    

    
 

Supongo que te gusta

Origin blog.csdn.net/Hoshea_sun/article/details/129782600
Recomendado
Clasificación