Javaのマルチスレッド - 同期:同期とスレッド間通信:生産者 - 消費者モデル

大きな男の素敵な週末は、私たちは夕食の技術に来た小さな音楽を提供します。最後に話しているJavaはマルチスレッドや状態を作成|音楽バイト、そして、私たちはその後、Javaはマルチスレッドとしましょう- 同期:同期とスレッド間通信:生産者-消費者モデル

同期:同期

複数のスレッドが同時に、いわゆる同期を非スレッドセーフ、データが間違っている可能性があり引き起こす可能性がオブジェクトにアクセス:訪問同時に複数のスレッドを制御することは、同じオブジェクトを操作するマルチスレッド制御同じオブジェクト、データの精度に注意を払う、確実にするためですデータセキュリティ、しかしので効率が比較的低いので、待つ必要の同期を追加した後。

以下のような:リンゴ、かむすると同時に、男は間違って行くが、複数の人ではないだろう自分自身を噛まないようにどのように、適切に管理されていないこの時間ならば、それはもうお互いをかむことができます。再びリンゴがあります。

電車の中で12306、なぜ票をつかむための時間は、座席の支払いをロックする前に待機する必要がありますか?これは、人だけでチケットを購入することを確認することです。


図1に示すように、シンクブロック

シンクブロック:ブロックは、+を同期

同期(参照型|主題|クラスの.class){

}


図2に示すように、同期方法

シンクロナイズド修飾子戻り値の型|空メソッドのシグネチャ{

}

3、デッドロック

あまりにも簡単に同期デッドロック

/**
* 死锁:容易造成死锁
* @author Administrator
*
*/
public class TestDeadLock {
/**
* @param args
*/
public static void main(String[] args) {
Object obj1 =new Object();
Object obj2 =new Object();
new A(obj1,obj2).start();
new B(obj1,obj2).start();
} }
class A extends Thread{
Object obj1 ;
Object obj2;
public A() {
}
public A(Object obj1, Object obj2) {
super();
this.obj1 = obj1;
this.obj2 = obj2;
}
@Override
public void run() {
synchronized(obj1){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(obj2){
} 
}
System.out.println("给我烟");
} }
class B extends Thread{
Object obj1 ;
Object obj2;
public B() {
}
public B(Object obj1, Object obj2) {
super();
this.obj1 = obj1;
this.obj2 = obj2;
}
@Override
public void run() {
synchronized(obj2){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(obj1){
} }
System.out.println("给我钱");
} 
}复制代码


第二に、スレッド間通信:生産者 - 消費者モデル

ターゲットスレッドは、スレッド間の通信は、相互に信号を送信することができる可能にすることです。一方、スレッドがどのスレッド間通信を待つことができるように

彼のスレッドを知らせます。

Javaは、信号待ちは非動作状態になりながらのスレッドが待機できるようにする組み込みのメカニズムを持っています。

java.lang.Objectクラスは、これを達成するためのメカニズムを待つ)(通知)(待って、3つのメソッドを定義する)とのnotifyAll(。任意のオブジェクト待ち()メソッドのスレッドの呼び出しと、別のスレッドが同じオブジェクト()メソッドを通知呼び出すまで、非動作状態になるであろう。)(ウェイトを呼び出す)または(通知するために、スレッドは、最初のオブジェクトのロックを獲得しなければなりません。言い換えれば、スレッドが)((待機中シンクブロックと呼ばれる)、または通知しなければなりません。

以下では、通信のスレッド間で共有目的を達成するために)(ウェイトの使用(IS)と通知します。

  /**
* 街道
* @author Administrator
*
*/
public class Street {
//红绿灯
//false 红灯 -->人等 车走 -->换灯 通知人走
//true 绿灯 -->车等 人走 -->换灯 通知车走
private boolean flag=false;
//东西向 -->人道
public synchronized void west(){
if(flag==false){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("东西向-->人走");
//换灯
this.flag =false;
this.notify(); //唤醒等待者
}
//南北向 车道
public synchronized void north(){
if(flag==true){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("南北向-->车走");
//换灯
this.flag =true;
this.notify(); //唤醒等待者
} }
class Person extends Thread {
private Street s ;
public Person(Street s) {
this.s = s; }
public void run() {
for(int i=0;i<10;i++){
s.west(); //东西向
}} }
class Car extends Thread {
private Street s ;
public Car(Street s) {
this.s = s; }
public void run() {
for(int i=0;i<10;i++){
s.north();
} 
} 
}复制代码

Javaのマルチスレッドおよびスレッド同期通信は、ここで紹介し、より技術的な音楽のバイトを乾燥させるために注意を払ってください。バイトオリジナルの音楽!


おすすめ

転載: juejin.im/post/5d4f905af265da03d871aef0