スレッドとプロセス図
工場、ワークショップ、労働者
並行プログラミングは、3つの主要な問題に抽象化できます。並行プログラミングを分工、同步/协作、互斥
学ぶには、これら3つのコアを完全に理解することが重要です。
分業
現在のスプリントのストーリーを「適切な」サイズのタスクに分割し、それらを「適切な」チームメンバーに割り当てて完了します
分業に関しては、共通のエグゼキュータ、生産者/消費者モデル、フォーク/ジョインなどはすべて分業の現れです。
同期/コラボレーション
タスクは分割され、タスク間に依存関係があります。前のタスクが実行された後、後続のタスクを実行できます。上級スタッフは、コミュニケーションを通じて繰り返し確認し、タスクが実行できることを確認できます。しかし、プログラムに直面して、プログラムの通信方法、スレッドがタスクを完了した後に実行するように後続のスレッドに通知する方法を理解する必要があります
//所有的同步/协作关系我们都可以用你最熟悉的 If-then-else 来表示:
if(前序任务完成){
execute();
}else{
wait();
}
当某个条件不满足时,线程需要等待;当某个条件满足时,线程需要被唤醒执行
スレッド間の連携は、メインスレッドと子スレッド間の連携、または子スレッドと子スレッド間の連携の場合があります。JavaSDKのCountDownLatchとCyclicBarrierは、スレッド連携の問題を解決するために使用されます。
相互に排他的
分業と同期はパフォーマンスを重視しますが、相互排除は正確性を重視します。「スレッドセーフ」。
複数のスレッドが共有変数/メンバー変数に同時にアクセスすると、不確実性が発生する可能性があります。不確実性の主な理由は可见性、原子性、有序性
次の3つです。これらの問題を解決するための核心は相互排除です
相互に排他的
同一时刻,只允许一个线程访问共享变量
同様に、Java SDKにも相互に排他的なソリューションが多数あります。たとえば、synchronizedキーワードをすぐに思いつくことができます。Lock、ThreadLocalなどは相互に排他的なソリューションです。
総括する
資本家は、最大の利益を得るために労働者の余剰価値を必死に絞ります。CPU、メモリ、IOなどの労働者に直面するとき、あなたは資本家であり、彼らの価値を完全に引き出す方法を考えなければなりません。
- 作業者が仕事をすることができるときは、決して2人に仕事をさせないでください(シングルスレッドで十分で、マルチスレッドの必要はありません)
- 複数の労働者が働いているとき、彼らは明確な分業、円滑な協力、そして対立がない必要があります
タスクが非常に大きい場合、IOの動作が遅く、CPUの動作が速いため、CPUを停止させて、現在のIOが他の命令を実行するのを待つ必要はありません。これは、残りの値をスクイーズする方法とスクイーズする方法です。その値は最大になります。適切なスレッドの数など、その後のチューニングの問題が含まれます。
分業は設計であり、同期と相互排除は実現です。優れた設計がなければ、優れた実現はありません。分業では、より良い実現を
完全に実現できるように、ボトルネックをスケッチして理解することを強くお勧めします。現実の現実と統合されています。、同時実行の問題は、基本的に現実のプロトタイプを見つけることができます