Maison  >  Article  >  Java  >  Apprenez à lire correctement le code source de jdk

Apprenez à lire correctement le code source de jdk

little bottle
little bottleavant
2019-04-08 16:47:122534parcourir

Cet article parle principalement de la façon de lire le code source de jdk lui-même. Nous discuterons plus tard de la lecture du code source de divers frameworks.

L'auteur estime que la lecture du code source comprend principalement les étapes suivantes.

Fixez-vous des objectifs

Tout a un but, et il en va de même pour la lecture du code source.

D'un point de vue plus large, le but de la lecture du code source est d'améliorer nos compétences techniques, de les appliquer au travail, de localiser rapidement les problèmes lorsque nous les rencontrons, d'obtenir des promotions et des augmentations de salaire, etc.

D'un petit point de vue, le but de la lecture d'un certain code source est de comprendre ses principes, qui est l'entêtement à explorer la vérité.

Le but est abstrait et le but est spécifique Nous devons nous fixer un objectif avant de lire le code source.

Par exemple, pour ConcurrentHashMap, que nous étudierons ensemble dans le prochain chapitre, nous pouvons fixer les objectifs suivants :

(1) Familiarisé avec la structure de stockage de ConcurrentHashMap

(2) Familiarisé avec le processus de mise en œuvre des principales méthodes dans ConcurrentHashMap

(3) Explorez les nouvelles technologies émergentes dans ConcurrentHashMap

Posez des questions

Après avoir l'objectif, nous devons essayer de poser des questions.

En prenant ConcurrentHashMap comme exemple, l'auteur a soulevé les questions suivantes :

(1) Les structures de données de ConcurrentHashMap et HashMap sont-elles les mêmes ?

(2) Quand HashMap aura-t-il des problèmes de sécurité de concurrence dans un environnement multithread ?

(3) Comment ConcurrentHashMap résout-il les problèmes de sécurité de concurrence ?

(4) Quels verrous ConcurrentHashMap utilise-t-il ?

(5) Comment s'effectue l'expansion de ConcurrentHashMap ?

(6) ConcurrentHashMap est-il fortement cohérent ?

(7) Quels problèmes ne peuvent pas être résolus par ConcurrentHashMap ?

(8) En plus de la sécurité de la concurrence, quelles autres différences ConcurrentHashMap présente-t-il par rapport à HashMap ? Pourquoi doit-il être implémenté de cette manière ?

(8) Quelles technologies rares valent la peine d'être apprises dans ConcurrentHashMap ?

Comment poser des questions

Beaucoup de gens diront, je sais aussi poser des questions, mais comment poser des questions ?

C'est en effet une chose très difficile. L'auteur pense qu'il y a trois points principaux :

(1) Posez-vous la question

Demandez-vous en tant qu'intervieweur et posez-vous la question à mort. . Le genre a demandé.

Peu importe si vous ne pouvez pas vous poser quelques questions, veuillez voir ci-dessous.

(2) Demandez à Internet

Vous n'avez peut-être pas pensé à beaucoup de questions, vous devez donc aller en ligne et consulter les blogs connexes pour voir si d'autres ont posé des questions.

Ou consultez les questions d’entretien associées.

Par exemple, lorsque j'apprenais la classe ConcurrentHashMap, j'ai vérifié en ligne et beaucoup d'entre elles étaient basées sur jdk7. Ensuite, je peux poser une question, quelle est la différence entre l'implémentation de la classe ConcurrentHashMap dans jdk8 et. jdk7 ? Quelles optimisations jdk8 a-t-il apportées à jdk7 ?

(3) Continuez à découvrir les problèmes

Peu importe si vous ne pouvez pas poser quelques questions au début, la clé est de regarder. Ce n'est qu'en regardant que vous pourrez trouver plus de problèmes. .

Lisez le code source avec des questions, ignorez les détails inutiles et tenez-vous-en aux détails importants

Tout d'abord, assurez-vous de lire le code source avec des questions.

Deuxièmement, veillez à ignorer les détails inutiles.

Encore une fois, assurez-vous de vous concentrer sur les détails importants.

À première vue, les deux dernières étapes semblent contradictoires. En fait, elles ne le sont pas. Ignorer les détails inutiles, c'est éviter de se perdre dans le monde du code source, et se concentrer sur les détails importants, c'est clarifier les choses. véracité du code source.

Que vous ignoriez les détails ici ou que vous vous y teniez dépend principalement de leur pertinence par rapport au problème.

Le code source du jdk est relativement facile à lire. Si vous regardez le code source du printemps plus tard et que vous ne pouvez pas ignorer les détails inutiles, vous vous perdrez vraiment. Commençons par une préfiguration ~~

. Par exemple, j'ai déjà lu la méthode readObject() dans le code lié à la sérialisation d'ArrayList.

<span style="font-family: 宋体, SimSun;">"s.readInt();"<p></p></span>À quoi sert ce secteur de travail ? Est-il acceptable de l'omettre ? À ce stade, vous devez comprendre les connaissances liées à la sérialisation, puis examiner l'implémentation dans writeObject(). C'est le code dont vous avez besoin pour vous battre à mort. <span style="font-family: 宋体, SimSun;">"s.readInt();"</span><span style="font-family: 宋体, SimSun;">"SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacité);"<p> code>A quoi sert ce métier ? À première vue, il semble que le code soit lié aux autorisations et n'a rien à voir avec notre problème de "sérialisation". Si vous voulez vraiment savoir, marquez-le d'abord et étudiez cette chose une fois le problème de sérialisation résolu. <code><span style="font-family: 宋体, SimSun;">"SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);"</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();
        }
    }
}
Faire plus de comparaisons

Lors de la lecture du code source du jdk, il est également très important de faire plus de comparaisons. Les comparaisons peuvent également être divisées en comparaisons horizontales et comparaisons verticales.

(1) La comparaison horizontale

consiste à comparer avec des classes similaires. Par exemple, dans le module de collecte, il existe essentiellement diverses insertions, requêtes et suppressions d'éléments. À ce stade, des comparaisons peuvent être effectuées à partir de dimensions telles que la structure des données et la complexité temporelle.

(2) Comparaison verticale

Des comparaisons peuvent être faites à partir de l’histoire du développement des collections. Par exemple, l'historique de développement de HashMap, depuis l'implémentation (un seul tableau) (oui, vous pouvez directement utiliser un tableau pour implémenter HashMap), jusqu'à l'implémentation (plusieurs tableaux + listes chaînées), jusqu'à (plusieurs tableaux + listes chaînées + rouge-noir arbres) dans la réalisation jdk8, il s'agit d'une comparaison verticale.

Faire plus d'expériences

La dernière étape, la chose la plus importante est de faire plus d'expériences.

Par exemple, ConcurrentHashMap est-il fortement cohérent ?

Vous pouvez démarrer plusieurs threads pour appeler en continu les méthodes get(), put() et size() pour voir s'il existe une forte cohérence.

Patience & Persistance

Je n’en dirai pas grand chose, tout le monde le sait.

Quel que soit le domaine dans lequel vous évoluez, Patience et persévérance sont les qualités les plus précieuses.

Il en va de même pour la lecture du code source. Tant que vous persistez patiemment, vous finirez par gagner quelque chose.

[Cours recommandé : Tutoriel vidéo Java]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer