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) {
            }
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值