Java多線程知識點總結——進階篇(八) 之 等待喚醒機制 Lock 鎖升級版

JDK1.5 中提供了多線程升級解決方案。
將同步 Synchronized 替換成現實 Lock 操作。
將Object中的 wait、notify、notifyAll,替換成了Condition 對象。該對象可以對 Lock 鎖進行獲取。該示例中,實現了本方只喚醒對方操作

Lock: 替代了 Synchronized,關鍵API有:

lock ()
unlock()
newCondition()

Condition:替代了Object wait notify notifyAll,關鍵API有:

await()
signal()
signalAll()

上一篇文章的代碼通過 Lock 鎖進行升級,升級後的代碼如下:

import java.util.concurrent.locks.*;
import java.util.concurrent.locks.Lock;

class ProducerConsumerDemo2 {
    public static void main(String[] args) {
        Resource r = new Resource();

        Producer pro = new Producer(r);
        Consumer con = new Consumer(r);

        new Thread(pro).start();
        new Thread(pro).start();
        new Thread(con).start();
        new Thread(con).start();

    }
}

class Resource {
    private String name;
    private int count = 1;
    private boolean flag = false;
    private Lock lock = new ReentrantLock();

    private Condition condition_pro = lock.newCondition();
    private Condition condition_con = lock.newCondition();

    public void set(String name) throws InterruptedException {
        lock.lock();
        try {
            while (flag)
                condition_pro.await();
            this.name = name + "--" + count++;

            System.out.println(Thread.currentThread().getName() + "...生產者.."
                    + this.name);
            flag = true;
            condition_con.signal();//只喚醒 producer 的線程
        } finally {
            lock.unlock();//釋放鎖的動作一定要執行。
        }
    }

    public void out() throws InterruptedException {
        lock.lock();
        try {
            while (!flag)
                condition_con.await();
            System.out.println(Thread.currentThread().getName() + "...消費者........." + this.name);
            flag = false;
            condition_pro.signal();//只喚醒 Consumer 的線程
        } finally {
            lock.unlock();//釋放鎖的動作一定要執行。
        }

    }
}

class Producer implements Runnable {
    private Resource res;

    Producer(Resource res) {
        this.res = res;
    }

    public void run() {
        while (true) {
            try {
                res.set("+商品+");
            } catch (InterruptedException e) {
            }

        }
    }
}

class Consumer implements Runnable {
    private Resource res;

    Consumer(Resource res) {
        this.res = res;
    }

    public void run() {
        while (true) {
            try {
                res.out();
            } catch (InterruptedException e) {
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章