著者は、ソースコードを読むには主に次の手順が含まれると考えています。
すべてのものには目的があり、ソース コードを読む場合も同様です。
大きな観点から見ると、ソース コードを読む目的は、技術スキルを向上させ、それを仕事に応用し、問題が発生したときにすぐに特定し、昇進や昇給を得るなどです。
小さな観点から見ると、あるソース コードを読む目的は、その原理を理解することであり、真実を探求する執念です。
目的は抽象的、目標は具体的、ソースコードを読む前に自分自身で目標を設定する必要があります。
たとえば、次の章で一緒に学習する 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 サイトの他の関連記事を参照してください。