Javaコンカレントプログラミングを学ぶことはインタビューのためだけだと誰かが言ったのですか?10Kしか手に入らないのも不思議ではありません!

序文

採用のゴールデンシーズンでは、大企業は毎月数十人のJava開発者を吸収する必要があります。一般の人々にとって、それは経済的自由への数十のチケットです。経験要件は通常3年から始まりますが、3年の経験を持つ多くのJavaは片側にひどくぶら下がっています。Java 3年の「ハードル」とは何ですか?辛抱強く読んだ後、それは間違いなくあなたを助けます。

技術的な投稿は、就業年数に依存する投稿ではありません。3年の経験が装いです。私は大規模な工場の仕事の要件の詳細なリストをまとめました。20Kを超える多くのJava投稿は、基本的に高い同時実行性と配布の関連する経験を必要とします。経験豊富なインタビュアーは、Javaプログラマーにとって、並行プログラミングについて包括的かつ詳細に理解している場合、それは彼らが確かな技術的バックグラウンドを持っていることを意味することを知っています。

そのため、大手企業へのインタビューにはコンカレントプログラミングも必須項目です。たとえば、悲観的なロックと楽観的なロックはどのようなシナリオに適していますか?スレッド、プロセス、およびコルチンの本質的な違いは何ですか?一般的な高同時実行分散システムアーキテクチャは何ですか?急速なインターネットトラフィックの時代では、アプリケーションの同時パフォーマンス、処理機能、および処理の適時性に対する要件が高くなっています。高度な同時プログラミングは、シニア開発とシャオバイ開発の間の分岐点に直接なっています。

みんなのために11ポイントの同時プログラミング学習をまとめました

  1. 同時プログラミングの課題
  2. Java同時実行メカニズムの基本的な実現原理
  3. Javaメモリモデル
  4. Javaコンカレントプログラミングの基礎
  5. Javaでのロック
  6. Javaコンカレントコンテナとフレームワーク
  7. Javaの13のアトミック操作クラス
  8. Javaの同時実行ツールクラス
  9. Javaのスレッドプール
  10. エグゼキュータフレームワーク
  11. Java同時プログラミングの実践

同時プログラミングの課題

同時プログラミングの目的は、プログラムの実行速度を上げることですが、プログラムを最大限に同時に実行するために、より多くのスレッドを開始することではありません。同時プログラミングを実行するときに、複数のスレッドを介してタスクを実行してプログラムの実行を高速化する場合、コンテキストスイッチング、デッドロック、ハードウェアとソフトウェアによって制限されるリソースの制約など、多くの課題に直面します。この章では、いくつかの同時プログラミングの課題と解決策を紹介します。

1.1コンテキストスイッチ

1.2デッドロック

1.3リソース制約の課題

1.4この章のまとめ

画像

画像

次に、Java同時実行メカニズムの基本的な実装原則 

Javaコードはコンパイル後にJavaバイトコードになります。バイトコードはクラスローダーによってJVMにロードされます。JVMはバイトコードを実行し、最後にCPUで実行するためにアセンブリ命令に変換する必要があります。Javaで使用される同時実行メカニズムはJVM実装とCPU命令に基づいています。この章では、詳細を掘り下げて、Java同時実行メカニズムの基本的な実装原則について説明します。

2.1揮発性物質の適用

2.2同期の実現原理と応用

2.3アトミック操作の実現原理

2.4この章の要約

画像

画像

3つのJavaメモリモデル 

Javaスレッド間の通信はプログラマーに対して完全に透過的であり、メモリの可視性の問題はJavaプログラマーを簡単に悩ませる可能性があります。この章では、Javaメモリモデルの謎を明らかにします。この章は大きく4つの部分に分かれています。主にメモリモデルに関連する基本概念を紹介するJavaメモリモデルの基礎、Javaメモリモデルのシーケンシャル整合性は主に並べ替えとシーケンシャル整合性メモリモデルを紹介します。同期プリミティブは主に3つの同期を紹介します。プリミティブ(同期、揮発性、および最終)のメモリセマンティクスとプロセッサでの並べ替えルールの実現; Javaメモリモデルの設計では、主にJavaメモリモデルの設計原則と、プロセッサメモリモデルおよびシーケンシャルメモリとの整合性が導入されます。モデルの関係。

3.1Javaメモリモデルの基礎

3.2並べ替え

3.3順次一貫性

3.4揮発性メモリのセマンティクス

3.5ロックのメモリセマンティクス

3.6最終フィールドのメモリセマンティクス

3.7が発生する前

3.8ロックの再確認と初期化の遅延

3.9Javaメモリモデルの概要

3.10この章の要約

画像

画像

4つのスレッドの紹介 

最新のオペレーティングシステムがプログラムを実行すると、そのプロセスが作成されます。たとえば、Javaプログラムを起動すると、オペレーティングシステムがJavaプロセスを作成します。最新のオペレーティングシステムスケジューリングの最小単位は、LightWeightプロセスとも呼ばれるスレッドです。プロセス内に複数のスレッドを作成できます。これらのスレッドには、独自のカウンター、スタック、ローカル変数、その他の属性があり、共有にアクセスできます。メモリ変数。プロセッサはこれらのスレッドを高速でオンにし、ユーザーがこれらのスレッドが同時に実行されていることを実感できるようにします。

4.1スレッドの概要

4.2スレッドの開始と終了
4.3スレッド間の通信
4.4スレッドのアプリケーション例
4.5この章の要約
画像

画像

Javaの5つのロック 

この章では、Javaコンカレントパッケージのロックに関連するAPIとコンポーネント、およびこれらのAPIとコンポーネントの使用法と実装の詳細を紹介します。コンテンツは主に2つの側面を中心に展開します。使用、例を通じてこれらのコンポーネントの使用法を示し、ロック関連のAPIを詳細に紹介します。実装、ソースコードを分析して実装の詳細を分析します。これは、実装の詳細を理解する方が便利で正しいためです。コンポーネント。上記の2つの側面を通じて、開発者がロックの使用と実現についてある程度理解してくれることを願っています。

5.1ロックインターフェース

5.2キューシンクロナイザー
5.3リエントリーロック
5.4読み取り/書き込みロック
5.5LockSupportツール
5.6条件インターフェイス
5.7この章の要約
画像

画像

6つのJava同時コンテナとフレームワーク 

Javaプログラマーが並行プログラミングを実行するとき、他の言語のプログラマーと比較して満足しています。並行プログラミングマスターのDoug Leaは、Java開発者に多くの並行コンテナーとフレームワークを提供する努力を惜しまないからです。この章では、マスターによって作成されたコンカレントコンテナーとフレームワークについて理解し、各セクションの原理分析を通じて高度なコンカレントプログラムを設計する方法を学びましょう。

6.1実装原理とConcurrentHashMapの使用

6.2 ConcurrentLinkedQueue
6.3Javaでのブロッキングキュー
6.4Fork / Join Framework6.5
この章の要約

画像

画像

Javaの7つの13のアトミック操作クラス

プログラムが変数を更新するときに、複数のスレッドがこの変数を同時に更新すると、変数i = 1、Aスレッドがi + 1を更新、Bスレッドもi + 1を更新するなど、2つのスレッド操作の後に予期しない値を取得する場合があります。多分私は3に等しくないが、2に等しい。AスレッドとBスレッドは変数iを更新すると1になるため、これはスレッドに安全でない更新操作です。通常、この問題を解決するために同期を使用します。同期を使用すると、複数のスレッドが変数iを同時に更新しないようになります。JDK 1.5以降、Javaはjava.util.concurrent.atomicパッケージ(以下、Atomicパッケージと呼びます)を提供しています。このパッケージのアトミック操作クラスは、簡単な使用法、高性能、およびスレッドの安全性で変数を更新する方法を提供します。変数には多くの種類があるため、Atomicパッケージには、アトミック更新基本タイプ、アトミック更新配列、アトミック更新参照、およびアトミック更新属性(フィールド)の4種類のアトミック更新メソッドに属する合計13のクラスが含まれています。 。Atomicパッケージのクラスは、基本的にUnsafeを使用して実装されたパッケージクラスです。

7.1基本型クラスのアトミックアップデート

7.2アトミックアップデートアレイ
7.3アトミックアップデートリファレンスタイプ
7.4アトミックアップデートフィールドクラス
7.5この章のまとめ
画像

画像

Javaの8つの同時実行ツール

JDK同時実行パッケージには、いくつかの非常に便利な同時実行ツールクラスが含まれています。CountDownLatch、CyclicBarrier、およびSemaphoreツールクラスは、同時プロセス制御の手段を提供し、Exchangerツールクラスは、スレッド間でデータを交換する手段を提供します。この章では、いくつかのアプリケーションシナリオでこれらのツールを使用する方法を紹介します。

8.1 CountDownl、atchはマルチスレッドの完了を待機しています

8.2同期バリアCyclicBarrier8.3
同時スレッドの数を制御するセマフォ
8.4スレッド間でデータを交換するエクスチェンジャー
8.5この章のまとめ
画像

画像

Javaの9つのスレッドプール

Javaのスレッドプールは、最も使用されている同時実行フレームワークです。非同期または同時にタスクを実行する必要があるほとんどすべてのプログラムは、スレッドプールを使用できます。開発プロセスでは、スレッドプールを適切に使用することで3つのメリットが得られます。
まず、リソース消費を削減します。作成したスレッドを再利用することで、スレッドの作成と破棄による消費を削減します。
2番目:応答速度を向上させます。タスクが到着すると、スレッドが作成されるのを待たずにタスクをすぐに実行できます。
3番目:スレッドの管理性を向上させます。スレッドは希少なリソースです。無制限に作成すると、システムリソースを消費するだけでなく
、システムの安定性も低下します。スレッドプールは、統合された割り当て、調整、および監視に使用できます。ただし、スレッドプールを適切に使用するには、その実装の原則を知っている必要があります。

9.1スレッドプールの実現原理

9.2スレッドプールの使用
9.3この章の要約
画像

画像

 TenExecutorフレームワーク

Javaでは、スレッドはタスクを非同期で実行するために使用されます。Javaスレッドの作成と破棄には、ある程度のオーバーヘッドが必要です。実行するタスクごとに新しいスレッドを作成すると、これらのスレッドの作成と破棄は、多くのコンピューティングリソースを消費します。同時に、実行するタスクごとに新しいスレッドを作成すると、この戦略は最終的に高負荷状態でアプリケーションをクラッシュさせる可能性があります。Javaのスレッドは、作業単位であると同時に実行メカニズムでもあります。JDK 5以降、作業単位は実行メカニズムから分離されています。ワークユニットにはRunnableとCallableが含まれ、実行メカニズムはExecutorフレームワークによって提供されます。

10.1実行フレームワークの概要

ThreadPoolExecutorの10.2詳細説明
10.3詳細の説明のScheduledThreadPoolExecutor
10.4詳細の説明FutureTask
この章の10.5概要

画像

画像

11のJavaコンカレントプログラミングプラクティス 

コンカレントプログラミングをしているとき、自分の最適化の下でプログラムの実行速度がどんどん速くなるのを見ると、ますます充実感を感じるでしょう。これがコンカレントプログラミングの魅力です。しかし同時に、同時プログラミングの問題とリスクも続く可能性があります。この章では、最初に並行プログラミングのいくつかの実際的なケースを紹介し、次に並行プログラミングによって引き起こされる問題のトラブルシューティング方法を紹介します。

11.1プロデューサーおよびコンシューマーモデル

11.2オンラインの問題の場所
11.3パフォーマンステスト
11.4非同期タスクプール
11.5この章の要約

画像

 画像

総括する 

高度な同時プログラミングの能力により、初級から上級への困難な飛躍を実現しました。超高度な同時アプリケーションの実際の戦闘をマスターし、他の人があなたの仕事、チーム、およびインタビューで複製するのが難しいコア競争力を持っています。** 20k、30k、さらには40k **のJava位置は問題ではありません。

上記の情報のテクニカルエディターは400ページを超えるドキュメントに編成されており、2020年のインタビューの質問もあります。このインタビューの質問に含まれるモジュールは、Javaの基本、コンテナー、マルチスレッド、リフレクション、オブジェクトコピーの19のモジュールに分かれています。 、Java Web、例外、ネットワーク、デザインパターン、Spring / Spring MVC、Spring Boot / Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM。
パブリックアカウントに注意してください:プログラマーBai Nannan、上記の情報を入手してください。

おすすめ

転載: blog.51cto.com/14975073/2563025
おすすめ