文档章节

Lock的实现类ReentrantLock&Condition类的await/signal/signalAll(生产者消费者场景)

o
 osc_1ee7cxmx
发布于 2018/08/06 21:04
字数 494
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

jdk1.5之后

 java.util.concurrent.locks.Lock

Lock接口

方法:lock

   unlock

   newCondition

   tryLock

   tryLock(?)

   lockInterruptibly

实现类:ReentrantLock

    ReadLock

    WriteLock

    (ReadLock和WriteLock是ReentrantReadWriteLock的静态内部类)


 

详解ReentrantLock

 

    

 

 

 

 

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

/**
 * @author DuanJiaPing
 * @date 2018/6/11 9:08
 *
 * 等待喚醒機制
 *
 * 生產者和消費者案例
 * 生產者生產的產品給店員,消費者從店員那獲取產品
 *
 * 使用lock同步锁
 * lock同步锁也有自己的线程等待和唤醒机制
 *
 * 通过Lock同步锁实现线程的通信,必须依赖Condition实例
 *
 * Condition
 * await()
 * signal()
 * signalALL()
 * Condition实例实质上被绑定到一个锁上
 * 为特定的Lock实例获得Condition实例,使用newCondition()方法
 *
 */
public class TestProductorAndConsumer2 {


    public static void main(String[] args){
        Clerk2 clerk = new Clerk2();
        Productor2 productor = new Productor2(clerk);
        Consumer2 consumer = new Consumer2(clerk);

        new Thread(productor,"生产者A").start();
        new Thread(consumer,"消费者1").start();
        new Thread(productor,"生产者B").start();
        new Thread(consumer,"消费者2").start();
        new Thread(consumer,"消费者3").start();
        new Thread(consumer,"消费者4").start();

    }


}

/*
* 店员类
* 店员进货、售货,只有一个店员
* */

class Clerk2{

    /*库存*/

    private int product = 0;

    private Lock lock = new ReentrantLock();

    /*获取Condition实例*/

    Condition condition = lock.newCondition();

    /*
    * 此时,进货和售货的两个方法都操作共享数据product(库存)
    * 因此,这两个方法都存在线程安全问题
    * 解决:lock同步锁
    *
    * */

    /*
    * 进货
    * */


    public void get(){

        lock.lock();
        try{
            while (product >= 8) {
                System.out.println("库存已满");
                try{
                    condition.await();
                }catch(Exception e){

                }
            }

            System.out.println(Thread.currentThread().getName()+"--进货--当前库存--"+ ++product);

            condition.signalAll();
        }finally {
            lock.unlock();
        }

    }

    /*
    * 售货
    * */

    public void sale(){
        lock.lock();
        try{
            while(product <= 0){
                System.out.println("库存不足");
                try{
                    condition.await();
                }catch(Exception e){

                }
            }

            System.out.println(Thread.currentThread().getName()+"--售货--当前库存--"+ --product);

            condition.signalAll();
        }finally {
            lock.unlock();
        }

    }
}

class Productor2 implements Runnable{
    private Clerk2 clerk;

    public Productor2(Clerk2 clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        //不断生产10个产品,提供给店员

        for(int i=1;i<=10;i++){
            clerk.get();
        }
    }
}


/*消费者类
* 消费者从店员处购买产品
* 多个消费者
* 多线程*/

class Consumer2 implements Runnable{
    private Clerk2 clerk;

    public Consumer2(Clerk2 clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        try{
            Thread.sleep(200);
        }catch (Exception e){

        }
        for(int i=1;i<=5;i++){
            clerk.sale();
        }

    }
}

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

OSChina 周日乱弹 —— 那么长的绳子,你这是放风筝呢

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @ 巴拉迪维:黑豹乐队的单曲《无地自容》 耳畔突然响起旋律,是那首老歌。中国摇滚有了《一无所有》不再一无所有;中国摇滚有了《无地自容》不...

小小编辑
35分钟前
31
1
《吐血整理》-顶级程序员书单集

你知道的越多,你不知道的越多 给岁月以文明,而不是给文明以岁月 前言 王潇:格局决定了一个人的梦想,梦想反过来决定行为。 那格局是什么呢? 格局是你能够看见的深度、广度和密度。 王潇认...

敖丙
2019/12/11
8
0
我可以在Android版式中加下划线吗? - Can I underline text in an Android layout?

问题: 如何在Android布局xml文件中定义带下划线的文本? 解决方案: 参考一: https://stackoom.com/question/A31z/我可以在Android版式中加下划线吗 参考二: https://oldbug.net/q/A31z/...

法国红酒甜
37分钟前
18
0
干掉ELK | 使用Prometheus+Grafana搭建监控平台

什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。 Prometheus的特点 · 多维度...

木九天
57分钟前
34
0
拉勾网拉你上勾

预览 需求简介 拉勾网是一个互联网行业的一个招聘网站,上面有许多职位,于是乎,小编想提取指定职位的基本信息(职位名,薪水,工作经验,工作地点,教育背景),然后插入 MongoDB 数据库,...

木下瞳
2019/04/17
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部