java多執行緒與併發 - Condition(條件)

b9x_發表於2018-02-14

關於Condition

  1. Condition即條件,JDK描述:條件(也稱為條件佇列 或條件變數)為執行緒提供了一個含義,以便在某個狀態條件現在可能為 true 的另一個執行緒通知它之前,一直掛起該執行緒(即讓其“等待”)。因為訪問此共享狀態資訊發生在不同的執行緒中,所以它必須受保護,因此要將某種形式的鎖與該條件相關聯。等待提供一個條件的主要屬性是:以原子方式釋放相關的鎖,並掛起當前執行緒,就像 Object.wait 做的那樣。
    Condition實質上是被繫結到一個鎖上。
  2. 為什麼使用Condition?
    Condition的出現是為了更精細控制執行緒等待與喚醒,我們常熟悉的執行緒的等待與喚醒依靠的是Object物件的wait()和notify()/notifyAll()方法, 其只能形成一個等待佇列,而使用Condition可以根據條件形成多個等待佇列,對多個等待佇列進行操作,更加靈活。
  3. Condition例項化是通過一個Lock物件呼叫newCondition()方法來例項的,也正是Condition例項就和一個鎖物件繫結起來了。Condition實際上就是將 Object的wait、notify 和 notifyAll功能抽象出來,從而形成多個等待佇列。

Condition的使用

package com.zx.condition;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;


public  class Demo {

    private int singal;
    ReentrantLock lock=new ReentrantLock();
    Condition conditionA=lock.newCondition();
    Condition conditionB=lock.newCondition();
    Condition conditionC=lock.newCondition();
    public void a(){
        lock.lock();
        while(singal!=0){
            try {
                conditionA.await();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("a");
        singal++;
        conditionB.signal();
        lock.unlock();

    }

    public void b(){
        lock.lock();
        while(singal!=1){
            try {
                conditionB.await();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("b");
        singal++;
        conditionC.signal();
        lock.unlock();  
    }

    public void c(){
        lock.lock();
        while(singal!=2){
            try {
                conditionC.await();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("c");
        singal=0;
        conditionA.signal();
        lock.unlock();
    }

    public static void main(String[] args) {
        Demo demo=new Demo();
        A a=new A(demo);
        B b=new B(demo);
        C c=new C(demo);
        new Thread(a).start();
        new Thread(b).start();
        new Thread(c).start();
    }
}

class A implements Runnable{

    private Demo demo;

    public A(Demo demo){
        this.demo=demo;
    }
    public void run(){
        while(true){
            demo.a();
        }
    }
}

class B implements Runnable{

    private Demo demo;

    public B(Demo demo){
        this.demo=demo;
    }
    public void run(){
        while(true){
            demo.b();
        }
    }
}

class C implements Runnable{

    private Demo demo;

    public C(Demo demo){
        this.demo=demo;
    }
    public void run(){
        while(true){
            demo.c();
        }
    }
}

Condition的原理

https://www.cnblogs.com/zhengbin/p/6420984.html

相關文章