I.はじめに
長年の懸案並行プログラミングは、今日は最初の章を開始する、それが分割され二つの最も学習:基礎と高度な章は以下に分割された学習の基礎を開始しました。
第二に、並行プログラミングの概念
2.1。同期(SYNC)と非同期(非同期)
2.2.1同期(SYNC)
関数呼び出しは、ない結果になるまで、呼び出しが戻るか、またはフォローアップしていきませんとき、いわゆる同期が発行されます。
この定義によると、すべての同期呼び出しされているJavaメソッド、結果が継続するまで待機する必要があります。私たちは、一般的に完了するまでにしばらく時間がかかりますコラボレーションや、もう一方の端を必要とするタスクに特異的に意味し、同期および非同期の時の話をしています。簡単に言えば、同期は、このような次のことを行うために行わフロントとして、一つのことを行う必要があります。
2.2.2非同期(非同期)
呼び出し側は結果ではなかったになるまで非同期および同期コントラスト、非同期プロシージャ・コールが発行されると、その後の操作が進むことができます。通話が終了すると、通常の状態、通知とコールバックを通じて、発信者に通知します。非同期呼び出しの場合、呼び出し側の制御によって返されないコール。
次のように示します:
2.2(並列の)同時(並行)と平行
並行性と並列性は非常に簡単に混乱して二つの概念です。彼らは一緒に行うことができる2つの以上のタスクを表しますが、焦点は異なっています。以下に示すように交互に複数のタスクを実行し、タスクを並列に、直列の複数の間に依然として可能である上の同時重点は、「両方の」真の意味です。
1つのCPUのみがシステムに存在する場合、実際には、その後、マルチプロセスまたはマルチスレッドタスクの使用、実環境、これらのタスクは結局、CPUが1つの命令のみ、マルチプロセスを実行するか、この場合にはできる、真の並列することはできませんマルチスレッディングは、(オペレーティング・システムがマルチタスク切り替えに続ける)平行でない、同時です。システム内(例えばマルチコアCPUのような)実のみ発生することがあり、並列CPUを複数有しています。
2.3。重要エリア
パブリックリソースやデータ共有の重要な領域を表し、それが複数のスレッドで使用することができます。しかし、すべての時間はわずか重要なリソース領域が占有されると、他のスレッドがリソースの解放後にリソースを引き続き使用するのを待つ必要があり、それを使用することができますスレッドがあります。Javaプログラムの開発では、このような操作のためのリソースは、一般的に同期を行う必要があり、例えば、synchronizedキーワードで次のコードは、クリティカルセクションのリソースを同期させることです。
package com.MyMineBug.demoRun.test;
/**
*
* @author 18360
*
*/
public class SyncTest implements Runnable {
// 临界区资源
public static SyncTest instance = new SyncTest();
@Override
public void run() {
synchronized (instance) {
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new SyncTest());
Thread t2 = new Thread(new SyncTest());
t1.start();
t2.start();
t1.join();
t2.join();
}
}
复制代码
2.4(ブロッキング)ブロッキングとノンブロッキング(非ブロッキング)
ブロッキングと非ブロッキング通常、多くのスレッド間の相互作用を記述するために使用されます。たとえば、スレッドは、このスレッドに必要な他のすべてのリソースは、この重要な分野で待つ必要があり、共有リソースを占有します。待機中はスレッドがハングアップし、この状況はブロックされます。リソーススレッドがリソースを解放するために難色を示してきた場合は、この時点では、その後、他のスレッドが動作していないスレッドのこの重要な領域にブロックされています。
非ブロッキングは、すべてのスレッドが先に実行し続けるためにしようと、それは他のスレッドに干渉する可能スレッドがあることを強調し、反対の意味します
2.5デッドロック(デッドロック)、空腹(飢餓)及びライブロック(ライブロック)
2.5.1デッドロック(デッドロック)
デッドロックは、一般的に互いに必要なリソースを保持し、他方はAブロック状態を解除するために常に待機している2つの以上のスレッドを指します。リソースクリティカル領域Cを共有しながら、例えば、二つのスレッドAとBがあるC Aによって占められるとき、Bがブロックされている、しかし、リソースBを使用する必要性を解放し、この方法は、それがA'veを待ってなり、 Bは、Bは永遠に他の状態の解除を待って、互いの間、待っています。
以下は、デッドロックの簡単な例です:
package com.MyMineBug.demoRun.test;
public class Demo1 {
public static String obj1 = "obj1";
public static String obj2 = "obj2";
public static void main(String[] args) {
Thread a = new Thread(new Lock1());
Thread b = new Thread(new Lock2());
a.start();
b.start();
}
}
class Lock1 implements Runnable {
@Override
public void run() {
try {
System.out.println("Lock1 running");
while (true) {
synchronized (Demo1.obj1) {
System.out.println("Lock1 lock obj1");
Thread.sleep(3000);// 获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2
synchronized (Demo1.obj2) {
System.out.println("Lock1 lock obj2");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Lock2 implements Runnable {
@Override
public void run() {
try {
System.out.println("Lock2 running");
while (true) {
synchronized (Demo1.obj2) {
System.out.println("Lock2 lock obj2");
Thread.sleep(3000);
synchronized (Demo1.obj1) {
System.out.println("Lock2 lock obj1");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
复制代码
結果は以下の通りであります:
一般的には、デッドロックは、デッドロックを解決するために不合理と困難に起因するプログラムの設計に、最善の方法は予防であるために発生します。
2.5.2空腹(飢餓)
飢餓は実行できなかった、その結果、必要なリソースを得ることができない様々な理由のために1つ以上のスレッドを指します。そのスレッドの優先順位などが低すぎると、優先度の高いスレッドは、優先度の低いリソースに動作しないで、その結果、それは必要なリソースを占有し続けます。
2.5.3ライブロック(ライブロック)
ライブロック状況が生活の中で私たちは、このような事態が発生する可能性があり、非常に興味深い状況をスレッドであり、それはドアがあなたは彼がドアを進めてみましょうしようとして誰かに遭遇する可能性がある場合出て行くことである、彼はあなたを聞かせするつもりでした、結果として外出するバックアップそれらの両者は、あなたが他の側にもに、外出すると、あちこちのドアで立ち往生したときに前進しようとしています。もちろん、この種のものは、普通の人はすぐに解決されますが、スレッドはそれほど幸運ではなかっ満たされている場合。
二つのスレッドが公的資金で占められ、そして「謙虚」の原則に付着して使用する他の人のためのリソースへのイニシアチブを取るされている場合は、しかし、スレッド間のすべての鼓動を飲み続ける私は、二つのスレッド間でリソースをもたらしているでしょうしましょう資源のより少ない、このような状況は、ロック生きることです。
あなたが良い感じている場合、賞賛のポイントを作ります!!!
共有技術と愛の生活