javaの高い同時実行----個人の研究と要約レコードを理解します

1.まず、我々はいくつかの概念を理解する必要があります

1.同期(同期):あなたは同期メソッド呼び出しを開始すると、呼び出し側は、フォローアップ活動を続けるためには、従来の方法に戻るには、コールされるまで待たなければなりません順番にをすべてのまで。

2.非同期(非同期):非同期メソッド呼び出しメッセージングなどが、一度始め、メソッドの呼び出しはすぐに戻り、呼び出し側はその後の操作を続けることができます。非同期メソッドは、通常、別のスレッドでは「本物」を行います。全体のプロセスは、現在の呼び出し側の作業を妨げません。

3.同時(並行):時間の期間に、複数の事が交互この間に行わ。たとえば、次のように交互に入力するのと同じ入口に2つのキューが、あります。

4.パラレル(並列):複数のものは、同じ時間の同僚で起こります。たとえば:2つのなどの注入口にそれぞれ2つのキューが、あります。お互いを乱すことなく。

注意:実際には、システム内の1つのCPUのみが存在する場合、マルチプロセスまたはマルチスレッドのタスクは、実環境の使用は、これらのタスクが真の並列することはできません、すべての後に、CPUは、この場合には一つだけの命令を実行し、より多くのことができますまたはマルチスレッド処理が同時である、(オペレーティング・システムは、マルチタスクの切り替えを続ける)平行ではありません。唯一の並列システムで発生する真のは、複数のCPUの(例えば、マルチコアCPUなど)。

5.クリティカル領域:クリティカルセクションは、公共のリソースまたは共有データを示すために使用されているが、複数のスレッドで使用することができますが、クリティカルセクションのリソースが占有されると、この他のスレッドを使用するためには、それを使用するたびに一つだけのスレッドリソースが待機する必要があります。

ブロックされた6.(ブロッキング):スレッド取ってクリティカルセクションのリソースを、他のスレッドがこの重要な分野で待つ必要があり、このような状況がブロックされ、スレッドがハングします。

7.ノンブロッキング(非ブロッキング):スレッドが他のスレッドに干渉することはできません、すべてのスレッドが前方に実行するために続行しようとします。

8.デッドロック(デッドロック):複数のスレッドがリソースを解放していない、スレッドが継続しない方法でその結果、彼らが必要とするリソースの不足。

注意:コマンドラインを介して取得するために必要なpidのプロセス、それはまた、JDKによって提供することができるjstackコマンドで見ることができjconsole.exe直接現在のスレッドのPIDツールを表示します。自分のBaiduのを理解していません

9.空腹(飢餓):様々な理由のために1つ以上のスレッドを参照したいリソースを取得することはできません、リードは実行することができませんでした。例えば、それはあまりにも低い優先度であってもよく、高い優先度のスレッドが動作しない低優先度のスレッドが得られ、それは必要なリソースを占有し続けます

10.ライブロック(ライブロック):例えば、2つのスレッドが「謙虚」の原則に付着され、主導権を使用する他の人のためのリソースを解放しますが、常に二つのスレッド間の暴行資源につながる可能性があり、1つのスレッドを同時になし得ることができます通常、すべてのリソース。この状況は、ライブロックです

概要:ここでのコンセプトは練習が完璧になります理解し、より多くの、退屈なもっと一緒に学ぶことです。

2.同時実行レベルの概念

同時制御戦略によると、我々は同時のレベルに置くことができ、障害物何の飢餓バリアフリーロックフリーノーウェイトいくつか。

1.障害物:スレッドがブロックされ、その後、他のスレッドの前にリソースを解放し、現在のスレッドが続行できません。私たちが使用している場合synchronizedキーワードまたは再入可能ロックを、我々はスレッドをブロックされます。

2.いいえ飢餓:スレッド間の優先順位ではありません、そして、スケジューリング時間をスレッド常に優先度の高いスレッドを満たすために傾向があります。どちらに分かれている非アームロック公正ロックの両方のケースインチ すべてのスレッドが実行する機会を持つようにかかわらず、新しいスレッドの優先度の高いへフェアロックは、リソースを得るために、私たちは素直に、並ばなければなりません

3.ロール:ロールは最も弱い非ブロックスケジューリングです。2つのスレッドが実行を妨げられた場合、問題は党のクリティカルセクションにつながることはありませんので、中断されます。誰もがそれを行う方法、データの混乱を共有データを修正しますか?このような状況が検出されると、アクセシビリティスレッドの場合、それはすぐにデータのセキュリティを確保するために、彼が行っている変更をロールバックします。

4.ロックなし:いいえロック並列にアクセス可能です。ロックなしの場合の下では、操作は有限数のステップ内の重要なエリアを離れる完了するために、スレッドが存在しなければならないことを保証するために、ロックフリーの並行性をすべてのスレッドがクリティカルセクションへのアクセスを試みることができますが、違いがあります。

5. Noneを待っ:なしロックが唯一のスレッド操作がロックオンをもとに更なる拡張を待たずに、有限数のステップで完了することができる必要はありません。これは飢餓が発生することはありません、すべてのスレッドが有限数のステップ以内に完了しなければならないことを要求しています。このステップの上限をさらに待って待機することなく、スレッドの制限された数に分解することができるので、非独立いくつかである場合、その差は、異なるサイクルの数を制限することです

3並列の二つの重要な法則

なぜ、並列プログラムの以前の問題は、単純な議論を持って使用します。全体的に、最も重要なことは2つの目的にする必要があります。

まず、より良いパフォーマンスを得るためには、

第二に、ビジネスモデルのためには、複数の実行主体が必要です。

ここでは、より多くの注意が最初のケースに、問題がパフォーマンスに関連しています。並行プログラムの変換のためのシリアルプログラムは、一般的には、プログラムの全体的なパフォーマンスを向上させることができますが、どのくらいを向上させることができる、でもそれを向上させることができるかどうかを正確に言って、まだ検討すべき問題です。現在、この質問に答えるには、2つの法律、1つのがあるアムダールの法則、他はグスタフソンの法則が

:これら二つの法律について、かなり、パフォーマンス向上のために、自分のBaiduは、一般的には、方法についてのより詳細な顧客調査を理解していないCPUの数を増加させつつ、並列システムの割合を改善する方法を見つけるために

4.JMM(Javaのメモリモデル)関連する概念

JMM重要な技術的ポイントは、マルチスレッドを中心に展開発注、アトミック性、視認性を構築します

1.原子性:是指操作是不可分的,要么全部一起执行,要么不执行。在java中,其表现在对于共享变量的某些操作,是不可分的,必须连续的完成。比如a++,在操作a++的过程中,其他线程不会改变a的值。

注意:java中实现原子操作的方法大致有2种:锁机制、无锁CAS机制

2.可见性:可见性是指一个线程对共享变量的修改,对于另一个线程来说是否是可以看到的。比如:线程A对共享变量的修改要被线程B及时看到的话,需要进过以下步骤:1.线程A在自己的工作内存中修改变量之后,需要将变量的值刷新到主内存中 2.线程B要把主内存中变量的值更新到工作内存中

注意:可以使用volatilesynchronized来实现

3.有序性:有序性指的是程序按照代码的先后顺序执行。为了性能优化,编译器和处理器会进行指令冲排序,有时候会改变程序语句的先后顺序

5.理解进程和线程

1.进程:我们经常使用windows系统,经常会看见.exe后缀的文件,双击这个.exe文件的时候,这个文件中的指令就会被系统加载,那么我们就能得到一个关于这个.exe程序的进程。

2.线程:线程是轻量级的进程,是程序执行的最小单元,使用多线程而不是多进程去进行并发程序的设计,是因为线程间的切换和调度的成本远远小于进程,线程的所有状态在java.lang.Thread中的State枚举中有定义:

  New:表示刚刚创建的线程,这种线程还没有开始执行

  RUNNABLE:运行状态,线程的start()方法调用后,线程会处于这种状态

  BLOCKED:阻塞状态。当线程在执行的过程中遇到了synchronized同步块,但这个同步块被其他线程已获取还未释放时,当前线程将进入阻塞状态,会暂停执行,直到获取到锁。当线程获取到锁之后,又会进入到运行状态(RUNNABLE)

  WAITING等待状态。和TIMEWAITING都表示等待状态,区别是WAITING会进入一个无时间限制的等,而TIMEWAITING会进入一个有限的时间等待,那么等待的线程究竟在等什么呢?一般来说,WAITING的线程正式在等待一些特殊的事件,比如,通过wait()方法等待的线程在等待notify()方法,而通过join()方法等待的线程则会等待目标线程的终止。一旦等到期望的事件,线程就会再次进入RUNNABLE运行状态。

  TERMINATED表示结束状态,线程执行完毕之后进入结束状态。

注意:从NEW状态出发后,线程不能在回到NEW状态,同理,处理TERMINATED状态的线程也不能在回到RUNNABLE状态 

个人理解:单个CPU一次只能运行一个任务,任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。其中,一个进程可以包括多个线程,一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。需要注意的是:一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存

注意:以上全部都是基本概念的理解,对于高并发的代码技巧掌握,不要急于求成,更多的是要着重于每一个基础知识点的逐步积累,万丈高楼平地起,一起加油骚年们。

 

 

 

おすすめ

転載: www.cnblogs.com/Roger2Lj/p/11562509.html