Eine persönliche Referenzzusammenfassung, jede Ähnlichkeit ist rein zufällig!
1. Wie wird das Implementierungsprinzip von Hashmap und die Thread-Sicherheit von Hashtable implementiert?
HashMap ist tatsächlich als lineares Array implementiert, sodass es verständlich ist, dass der Container zum Speichern von Daten ein lineares Array ist.
Zunächst implementiert HashMap einen statischen inneren Klasseneintrag. Seine wichtigen Attribute sind Schlüssel und Wert. Anhand der Attribute Schlüssel und Wert können wir deutlich erkennen, dass Eintrag eine grundlegende Bean für die Implementierung des HashMap-Schlüsselwerts ist Wie oben erwähnt, ist die Basis von HashMap ein lineares Array. Dieses Array ist Entry[], und der Inhalt der Map wird in Entry[] gespeichert.
Der HashTable-Container verwendet synchronisiert, um die Thread-Sicherheit zu gewährleisten. Bei starker Thread-Konkurrenz ist die Effizienz von HashTable jedoch sehr gering. Denn wenn ein Thread auf die Synchronisationsmethode von HashTable zugreift, können andere Threads beim Zugriff auf die Synchronisationsmethode von HashTable in einen Blockierungs- oder Abfragezustand wechseln.
Die von ConcurrentHashMap verwendete Sperrsegmentierungstechnologie unterteilt die Daten zunächst zur Speicherung in Segmente und weist dann jedem Datensegment eine Sperre zu. Wenn ein Thread die Sperre belegt, um auf ein Datensegment zuzugreifen, können dies auch die Daten anderer Segmente auf die von anderen Threads zugegriffen werden kann.
2. Das Implementierungsprinzip von put() und get() von Hashmap?
Das erste Schlüssel-Wert-Paar A kommt herein und der Index=0, der durch die Berechnung des Hashs seines Schlüssels erhalten wird, wird wie folgt aufgezeichnet: Eintrag[0] = A. Nach einer Weile kommt ein weiteres Schlüssel-Wert-Paar B und sein Index ist durch Berechnung ebenfalls gleich 0. Was soll ich jetzt tun? HashMap macht Folgendes: B.next = A, Entry[0] = B. Wenn C erneut eintrifft, ist der Index ebenfalls gleich 0, dann finden wir C.next = B, Entry[0] = C; der Ort, an dem index = 0 ist. Tatsächlich wird auf drei Schlüssel-Wert-Paare A, B und C zugegriffen und sie werden über das nächste Attribut miteinander verknüpft. Machen Sie sich also keine Sorgen, wenn Sie Fragen haben. Das heißt, das zuletzt eingefügte Element wird im Array gespeichert.
get() sucht zuerst und durchquert dann.
3. Der Lebenszyklus der Frühlingsbohne?
Im Frühjahr ist das Singleton-Attribut standardmäßig auf „true“ gesetzt. Wenn es auf „false“ gesetzt ist, wird jedes Mal eine neue Instanz generiert, wenn die vom Alias erhaltene Bean angegeben wird.
3.1: Bean-Erstellung: Der Container sucht nach den Definitionsinformationen der Bean und instanziiert sie.
3.2: Attributinjektion.
3.3: BeanNameAware
3.4: BeanFactoryAware’s setBeanFactory()
3.5: BeanPostProcessors’ ProcessBeforeInitialization()
3.6: initializingBean’s afterPropertiesSet():
3.7: Init-Methode in Bean-Definitionsdatei definieren:
3.8: ProcessaAfterInitialization() von BeanPostProcessors
DisposableBeans destroy(), Destroy-Methode ist in der Bean-Definitionsdatei definiert
4. Wie verwaltet Spring Transaktionen?
Die Transaktion von Spring kann als Implementierung von Spring AOP bezeichnet werden. Reflexion und dynamische Proxys.
AOP-aspektorientierte Programmierung, dh Erweiterung der ursprünglichen Funktionen ohne Änderung des Quellcodes und Betrieb bestimmter Klassen über Proxy-Klassen.
Spring ist ein Container. Objekte werden über den Spring-Container verwaltet, und Spring verwaltet Objekte gemäß der Konfigurationsdatei.
Es gibt zwei Möglichkeiten, Transaktionen im Frühjahr zu deklarieren: programmatisch und deklarativ. Spring verwaltet Transaktionen hauptsächlich über „deklarative Transaktionen“, das heißt, sie werden in der Konfigurationsdatei deklariert und der Transaktionsaspekt wird über AOP in das Programm eingebunden. Der größte Vorteil besteht darin, dass die Codemenge erheblich reduziert wird.
5. Ist die Serviceschicht eine einzelne Instanz oder mehrere Instanzen? Ist es threadsicher? Was ist, wenn Sie mehrere Instanzen durchführen möchten?
Von Spring generierte Objekte sind standardmäßig Singletons. Es kann über das Bereichsattribut auf mehrere Instanzen geändert werden.
5.1 ist genau genommen ein Singleton ein ServletMapping, das einer Singleton-Instanz entspricht
5.2. Es gibt viele Möglichkeiten, die Sicherheit von Servlet-Threads aufrechtzuerhalten. Zweitens können einige Sperrmechanismen flüchtig und gesperrt sein ThreadLocal kann auch verwendet werden, um einen sicheren Kanal zu öffnen und gleichzeitig den Thread der anderen Partei aus Gründen der Thread-Sicherheit zu blockieren. Die Leistung ist jedoch sehr schlecht. Definieren Sie keine Variablen in der C-Schicht, um die Parallelität mehrerer Threads zu verhindern.
6. Die Verbreitung der Dinge? Datenbankisolationsstufe?
PROPAGATION_REQUIRED Wenn eine Transaktion vorhanden ist, wird die aktuelle Transaktion unterstützt. Wenn keine Transaktion vorhanden ist, aktivieren Sie
PROPAGATION_SUPPORTS. Wenn eine Transaktion vorhanden ist, unterstützen Sie die aktuelle Transaktion. Wenn keine Transaktion vorhanden ist, erfolgt die nicht-transaktionale Ausführung
PROPAGATION_MANDATORY. Wenn bereits eine Transaktion vorhanden ist, unterstützen Sie die aktuelle Transaktion. Wenn keine aktive Transaktion vorhanden ist, wird eine Ausnahme ausgelöst.
PROPAGATION_REQUIRES_NEW startet immer eine neue Transaktion. Wenn bereits eine Transaktion vorhanden ist, wird die bestehende Transaktion ausgesetzt.
PROPAGATION_NOT_SUPPORTED Immer nicht transaktionsorientiert ausführen und alle vorhandenen Transaktionen aussetzen.
PROPAGATION_NEVER wird immer nicht transaktional ausgeführt und löst eine Ausnahme aus, wenn eine aktive Transaktion vorhanden ist.
PROPAGATION_NESTED Wenn eine aktive Transaktion vorhanden ist, wird sie in einer verschachtelten Transaktion ausgeführt. Wenn keine aktive Transaktion vorhanden ist, wird die Ausführung durch TransactionDefinition ausgeführt. PROPAGATION_REQUIRED-Attribut
Standardmäßig verwenden wir
PROPAGATION_REQUIRED
① Serialisierbar: Es kann das Auftreten von Dirty Reads, nicht wiederholbaren Reads und Phantom Reads vermeiden.
② Wiederholbares Lesen: Dadurch kann das Auftreten von Dirty Reads und nicht wiederholbaren Lesevorgängen vermieden werden.
③ Read commit: Dadurch kann das Auftreten von Dirty Reads vermieden werden.
④ Nicht festgeschrieben lesen (Nicht festgeschrieben lesen): Die niedrigste Stufe, unter keinen Umständen Garantie.
Die Standardstufe für allgemeine Datenbanken ist „Read commited“.
Die Standardisolationsstufe von MySQL ist Wiederholbares Lesen.
Zeigen Sie die Isolationsstufe der aktuellen Transaktion in der MySQL-Datenbank an:
wählen Sie @@tx_isolation;
Legen Sie die Isolationsstufe der Transaktion in der MySQL-Datenbank fest:
set [glogal |. session] Transaktionsisolationsstufe Name der Isolationsstufe;
set tx_isolation='isolation level name;'
Denken Sie daran: Die Isolationsstufe der Datenbank muss vor dem Starten einer Transaktion festgelegt werden !
7. Wie erreicht Arraylist Thread-Sicherheit?
Um dieses Thread-Sicherheitsproblem zu lösen, können Sie Collections.synchronizedList() verwenden, wie zum Beispiel:
List
Die erste Methode:
Unter Windows in der Datei /bin/catalina.bat, unter Unix vor der Datei /bin/catalina. sh , fügen Sie die folgenden Einstellungen hinzu:
JAVA_OPTS='-Xms [Initialisierungsspeichergröße] -Xmx [Maximal verwendbarer Speicher]'
Es ist notwendig, die Werte zu erhöhen dieser beiden Parameter. Beispiel:
JAVA_OPTS='-Xms256m -Xmx512m'
Gibt an, dass der anfängliche Speicher 256 MB beträgt und der maximal nutzbare Speicher 512 MB beträgt.
Zweite Methode: Umgebungsvariablen festlegen Variablenname: JAVA_OPTS Variablenwert: -Xms512m -Xmx512m
Dritte Methode: Die ersten beiden Methoden gelten für den Fall, dass sich catalina.bat im bin-Verzeichnis befindet (z. B , direkt dekomprimiertes Tomcat usw.), aber einige installierte Versionen von Tomcat verfügen derzeit nicht über die folgende Methode: Öffnen Sie tomcatHome//bin //tomcat5w.exe, klicken Sie auf die Registerkarte „Java“, und Sie werden feststellen, dass es zwei Elemente gibt: „Anfangsspeicherpool“ und „Maximaler Speicherpool“ ist die Größe des initialisierten Speichers. Der maximale Speicherpool ist die maximale Speichergröße, drücken Sie OK und starten Sie TOMCAT neu. Sie werden feststellen, dass sich der für JVM in Tomcat verfügbare Speicher geändert hat.
Fügen Sie ihn unter @echo off in catalina.bat hinzu (die zweite Zeile). )
set JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=256m
9. Was ist die Standardimplementierungsklasse des Servlets?
lServlet-Schnittstelle SUN Company definiert zwei Standardimplementierungsklassen, nämlich: GenericServlet und HttpServlet.
Wenn es sich um eine GET-Anfrage handelt, rufen Sie die doGet-Methode von HttpServlet auf. Wenn es sich um eine Post-Anfrage handelt, rufen Sie die doPost-Methode auf. Wenn Entwickler Servlets schreiben, müssen sie daher normalerweise nur die doGet- oder doPost-Methode überschreiben, anstatt die Service-Methode zu überschreiben
Das obige ist der detaillierte Inhalt vonFragen zum Java-Interview (muss bei der Jobsuche gelesen werden). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!