JDKのソースコードを正しく読む方法を教えます

little bottle
リリース: 2019-04-08 16:49:50
転載
2579 人が閲覧しました

この記事では主にjdk自体のソースコードの読み方について説明しますが、各種フレームワークのソースコードの読み方については後ほど説明します。

著者は、ソースコードを読むには主に次の手順が含まれると考えています。

目標の設定

すべてのものには目的があり、ソース コードを読む場合も同様です。

大きな観点から見ると、ソース コードを読む目的は、技術スキルを向上させ、それを仕事に応用し、問題が発生したときにすぐに特定し、昇進や昇給を得るなどです。

小さな観点から見ると、あるソース コードを読む目的は、その原理を理解することであり、真実を探求する執念です。

目的は抽象的、目標は具体的、ソースコードを読む前に自分自身で目標を設定する必要があります。

たとえば、次の章で一緒に学習する ConcurrentHashMap については、次の目標を設定できます:

(1) ConcurrentHashMap のストレージ構造に精通する;

(2) ConcurrentHashMap の主要なメソッドの実装プロセスに精通している;

(3) ConcurrentHashMap で新たに登場している新しいテクノロジを探索する;

質問する

目標としては、何か質問を考え出さなければなりません。

さらに ConcurrentHashMap を例として、著者は次の疑問を提起しました:

(1) ConcurrentHashMap と HashMap のデータ構造は同じですか?

(2) マルチスレッド環境で HashMap に同時実行セキュリティの問題が発生するのはいつですか?

(3) ConcurrentHashMap は同時実行のセキュリティ問題をどのように解決しますか?

(4) ConcurrentHashMap はどのようなロックを使用しますか?

(5) ConcurrentHashMap の展開はどのように行われるのでしょうか?

(6) ConcurrentHashMap は強い一貫性を持っていますか?

(7) ConcurrentHashMap では解決できない問題は何ですか?

(8) 同時実行の安全性に加えて、ConcurrentHashMap は HashMap とどのような違いがありますか? なぜこのように実装する必要があるのですか?

(8) ConcurrentHashMap で学ぶ価値のある珍しいテクノロジは何ですか?

質問の仕方

多くの人は、「私も質問することは知っていますが、どうやって質問すればいいのですか?」と言うでしょう。

これは確かに非常に難しいことですが、ポイントは3つあると思います:

(1) 自分に問いかける

自分を面接官の立場になって自分に問いかけてください。死 尋ねられた種類。

いくつかの質問ができなくても問題ありません。以下をご覧ください。

(2) インターネットに質問する

自分では思いつかなかった質問がたくさんあるので、オンラインにアクセスして関連ブログをチェックし、他の人が質問していないか確認する必要があります。

または、関連する面接の質問についてお問い合わせください。

たとえば、ConcurrentHashMap クラスを学習していたときにオンラインで確認したところ、その多くは jdk7 に基づいていました。その後、jdk8 での ConcurrentHashMap クラスの実装と jdk8 での ConcurrentHashMap クラスの実装の違いは何か、という質問をすることができます。 jdk7? jdk8 は jdk7 に対してどのような最適化を行いましたか?

(3) 問題を発見し続ける

最初はいくつか質問できなくても問題ありません。重要なのは見ることです。見ることでのみ、より多くの問題を見つけることができます。 。

ソース コードを疑問を持ちながら読み、不必要な詳細は無視し、重要な詳細に焦点を当てましょう

まず、ソース コードを疑問を持ちながら読んでください。

第二に、不必要な詳細は必ず無視してください。

繰り返しますが、重要な詳細を必ず守ってください。

一見すると、最後の 2 つの手順は矛盾しているように見えますが、実際には矛盾しません。不必要な詳細を無視することは、ソース コードの世界に迷い込むことを避けるためであり、重要な詳細に焦点を当てることは、ソース コードの内容を明確にすることです。ソースコードの真実。

ここでの詳細を無視するか、それに固執するかは、主に問題との関連性によって決まります。

jdk のソースコードは比較的読みやすいですが、後から Spring のソースコードを見て余計な部分が無視できないと本当に迷ってしまいます。先に伏線を張っておきましょう~~

たとえば、以前に ArrayList のシリアル化関連コードの readObject() メソッドを読みました。

<span style="font-family: 宋体, SimSun;">"s.readInt();"</span>この作業は何のために行われますか?省略しても大丈夫でしょうか?このとき、シリアル化に関する知識を理解した上で、writeObject()の実装を見るという、死ぬ気で戦わなければならないコードです。

<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();
        }
    }
}
ログイン後にコピー

さらに比較を行う

jdk ソース コードを読むときは、より多くの比較を行うことも非常に重要です。比較は、水平比較と垂直比較にも分けられます。

(1) 水平比較

は、類似したカテゴリとの比較です。例えばコレクションモジュールでは、基本的に要素の挿入やクエリ、削除などが行われますが、その際にデータ構造や時間計算量などの次元で比較できる、これが水平比較です。

(2) 垂直比較

コレクション開発の歴史から比較できます。たとえば、HashMap の開発履歴は、(単一配列) 実装 (はい、配列を直接使用して HashMap を実装できます)、(複数配列リンク リスト) 実装、(複数配列リンク リスト赤黒ツリー) 実装に至るまでです。 jdk8では、これは垂直方向の比較です。

さらに実験を行う

最後のステップ、最も重要なことは、さらに実験を行うことです。

たとえば、ConcurrentHashMap は強い一貫性を持っていますか?

複数のスレッドを開始して get()、put()、および size() メソッドを継続的に呼び出して、強い一貫性があるかどうかを確認できます。

忍耐と粘り強さ

これについては多くは言いませんが、誰もが知っています。

あなたがどの分野に携わっていても、忍耐力と粘り強さが最も価値のある資質です。

ソースコードを読む場合も同様で、根気よく続けていれば必ず何かが得られます。

[おすすめコース: Java ビデオ チュートリアル ]

以上がJDKのソースコードを正しく読む方法を教えますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート