1. 程式人生 > >Java多執行緒知識點總結——進階篇(八) 之 等待喚醒機制 Lock 鎖升級版

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) { } } } }