Heim >Java >javaLernprogramm >Bringen Sie Ihnen bei, den JDK-Quellcode richtig zu lesen

Bringen Sie Ihnen bei, den JDK-Quellcode richtig zu lesen

little bottle
little bottlenach vorne
2019-04-08 16:47:122583Durchsuche

In diesem Artikel geht es hauptsächlich darum, wie man den Quellcode von JDK selbst liest. Wir werden später auf das Lesen des Quellcodes verschiedener Frameworks eingehen.

Der Autor ist der Ansicht, dass das Lesen des Quellcodes hauptsächlich die folgenden Schritte umfasst.

Ziele setzen

Alles hat einen Zweck, und das Gleiche gilt für das Lesen des Quellcodes.

Im Großen und Ganzen besteht der Zweck des Lesens von Quellcode darin, unsere technischen Fähigkeiten zu verbessern, sie bei der Arbeit anzuwenden, Probleme schnell zu lokalisieren, wenn sie auf sie stoßen, Beförderungen und Gehaltserhöhungen zu erhalten usw.

Aus einer kleinen Perspektive besteht der Zweck des Lesens eines bestimmten Quellcodes darin, seine Prinzipien zu verstehen, was die Hartnäckigkeit ist, die Wahrheit zu erforschen.

Der Zweck ist abstrakt und das Ziel ist spezifisch. Wir müssen uns ein Ziel setzen, bevor wir den Quellcode lesen.

Für ConcurrentHashMap, das wir im nächsten Kapitel gemeinsam untersuchen werden, können wir beispielsweise die folgenden Ziele festlegen:

(1) Vertraut mit der Speicherstruktur von ConcurrentHashMap

(2) Vertraut mit dem Implementierungsprozess der Hauptmethoden in ConcurrentHashMap; (3) Entdecken Sie neue Technologien, die in ConcurrentHashMap entstehen.

Stellen Sie Fragen

Das Ziel, wir müssen versuchen, eine Frage zu stellen.

Am Beispiel von ConcurrentHashMap stellte der Autor die folgenden Fragen:

(1) Sind die Datenstrukturen von ConcurrentHashMap und HashMap gleich?

(2) Wann wird HashMap in einer Multithread-Umgebung Probleme mit der Parallelitätssicherheit haben?

(3) Wie löst ConcurrentHashMap Sicherheitsprobleme bei der Parallelität?

(4) Welche Sperren verwendet ConcurrentHashMap?

(5) Wie wird die Erweiterung von ConcurrentHashMap durchgeführt?

(6) Ist ConcurrentHashMap stark konsistent?

(7) Welche Probleme können mit ConcurrentHashMap nicht gelöst werden?

(8) Welche weiteren Unterschiede gibt es zwischen ConcurrentHashMap und HashMap? Warum muss es auf diese Weise implementiert werden?

(8) Welche ungewöhnlichen Technologien sind es wert, in ConcurrentHashMap erlernt zu werden?

Wie man Fragen stellt

Viele Leute werden sagen, ich weiß auch, wie man Fragen stellt, aber wie stellt man Fragen?

Das ist in der Tat eine sehr schwierige Sache. Der Autor meint, dass es drei Hauptpunkte gibt:

(1) Fragen Sie sich selbst

Fragen Sie sich selbst als Interviewer und fragen Sie sich selbst zu Tode . Die Art fragte herein.

Es spielt keine Rolle, wenn Sie sich nicht ein paar Fragen stellen können, siehe unten.

(2) Stellen Sie eine Frage im Internet

Möglicherweise sind Ihnen nicht viele Fragen eingefallen, daher müssen Sie online gehen und in verwandten Blogs nachsehen, ob andere Fragen gestellt haben.

Oder schauen Sie sich die entsprechenden Interviewfragen an.

Als ich zum Beispiel die ConcurrentHashMap-Klasse lernte, habe ich online nachgesehen, dass viele davon auf jdk7 basierten. Dann kann ich eine Frage stellen: Was ist der Unterschied zwischen der Implementierung der ConcurrentHashMap-Klasse in jdk8 und jdk7? Welche Optimierungen hat jdk8 an jdk7 vorgenommen?

(3) Entdecken Sie weiterhin Probleme

Es macht nichts, wenn Sie am Anfang nicht ein paar Fragen stellen können. Der Schlüssel liegt darin, nachzuschauen .

Lesen Sie den Quellcode mit Fragen, ignorieren Sie unnötige Details und bleiben Sie bei den wichtigen Details

Lesen Sie zunächst unbedingt den Quellcode mit Fragen.

Zweitens achten Sie darauf, unnötige Details zu ignorieren.

Achten Sie auch hier darauf, sich auf die wichtigen Details zu konzentrieren.

Auf den ersten Blick scheinen die letzten beiden Schritte widersprüchlich zu sein. Tatsächlich dient das Ignorieren unnötiger Details dazu, sich nicht in der Welt des Quellcodes zu verlieren, und die Konzentration auf wichtige Details dient der Klärung Wahrheit des Quellcodes.

Ob Sie die Details hier ignorieren oder sich daran halten, hängt hauptsächlich von ihrer Relevanz für das Problem ab.

Der JDK-Quellcode ist relativ einfach zu lesen und kann unnötige Details nicht ignorieren. Lassen Sie uns zunächst einen Vorgeschmack geben Ich habe zum Beispiel schon einmal die Methode readObject() im serialisierungsbezogenen Code von ArrayList gelesen.

<span style="font-family: 宋体, SimSun;">"s.readInt();"</span>

Wozu dient dieser Arbeitsbereich? Ist es in Ordnung, es wegzulassen? Zu diesem Zeitpunkt müssen Sie die Kenntnisse im Zusammenhang mit der Serialisierung verstehen und sich dann die Implementierung in writeObject() ansehen. Dies ist der Code, den Sie zu Tode bekämpfen müssen.

"SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, Capacity);"

Code>Wozu dient dieser Arbeitsbereich? Auf den ersten Blick scheint es, dass der Code mit Berechtigungen zusammenhängt und nichts mit unserem Problem der „Serialisierung“ zu tun hat. Wenn Sie es wirklich wissen möchten, markieren Sie es zuerst und studieren Sie diese Sache, nachdem das Serialisierungsproblem gelöst ist. <span style="font-family: 宋体, SimSun;">"s.readInt();"</span>

private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
    // 声明为空数组
    elementData = EMPTY_ELEMENTDATA;

    // 读入非transient非static属性(会读取size属性)
    s.defaultReadObject();

    // 读入元素个数,没什么用,只是因为写出的时候写了size属性,读的时候也要按顺序来读
    s.readInt();

    if (size > 0) {
        // 计算容量
        int capacity = calculateCapacity(elementData, size);
        SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);
        // 检查是否需要扩容
        ensureCapacityInternal(size);
        
        Object[] a = elementData;
        // 依次读取元素到数组中
        for (int i=0; i<size; i++) {
            a[i] = s.readObject();
        }
    }
}

Mehr Vergleiche durchführen

<span style="font-family: 宋体, SimSun;">"SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);"</span>Beim Lesen des JDK-Quellcodes ist es auch sehr wichtig, mehr Vergleiche durchzuführen. Vergleiche können auch in horizontale Vergleiche und vertikale Vergleiche unterteilt werden.

(1) Horizontaler Vergleich

dient dem Vergleich mit ähnlichen Klassen. Beispielsweise gibt es im Sammlungsmodul grundsätzlich verschiedene Einfügungen, Abfragen und Löschungen von Elementen. Zu diesem Zeitpunkt können Vergleiche anhand von Dimensionen wie Datenstruktur und Zeitkomplexität durchgeführt werden.

(2) Vertikaler Vergleich

Vergleiche können aus der Geschichte der Sammlungsentwicklung gezogen werden. Zum Beispiel die Entwicklungsgeschichte von HashMap, von der Implementierung (einzelnes Array) (ja, Sie können ein Array direkt zur Implementierung von HashMap verwenden) über die Implementierung (mehrere Arrays + verknüpfte Listen) bis hin zur Implementierung (mehrere Arrays + verknüpfte Listen + Rot-Schwarz). Bäume) in jdk8 Realisierung, dies ist ein vertikaler Vergleich.

Machen Sie mehr Experimente

Der letzte Schritt und das Wichtigste ist, mehr Experimente durchzuführen.

Ist ConcurrentHashMap beispielsweise stark konsistent?

Sie können mehrere Threads starten, um kontinuierlich die Methoden get(), put() und size() aufzurufen, um zu sehen, ob eine starke Konsistenz vorliegt.

Geduld und Beharrlichkeit

Ich werde dazu nicht viel sagen, das weiß jeder.

Egal in welchem ​​Bereich Sie tätig sind, Geduld und Beharrlichkeit sind die wertvollsten Eigenschaften.

Das Gleiche gilt für das Lesen des Quellcodes. Solange Sie geduldig bleiben, werden Sie irgendwann etwas gewinnen.

[Empfohlener Kurs: Java-Video-Tutorial]

Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen bei, den JDK-Quellcode richtig zu lesen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen