详解Lock机制下API用法

知识的广度来自知识的深度,学习如果不成体系那是多可怕的一件事儿,希望我们在未来的学习道路上坚守初心,不要给自己留下遗憾,以自己喜欢的方式生活,做自己喜欢做的事,宠爱自己,做一个独一无二的自己!

  • 对于文章中出现的任何错误请大家批评指出,会及时做出修改!
  • 有任何想要讨论和学习的问题可联系我:cittaksana@qq.com

一、Lock体系结构

1、基础接口简介

Lock加锁相关结构中涉及两个使用广泛的基础API:ReentrantLock类和Condition接口,基本关系如下:
在这里插入图片描述

Lock接口
Java并发编程中资源加锁的根接口之一,规定了资源锁使用的几个基础方法。
ReentrantLock类
实现Lock接口的可重入锁,即线程如果获得当前实例的锁,并进入任务方法,在线程没有释放锁的状态下,可以再次进入任务方法,特点:互斥排它性,即同一个时刻只有一个线程进入任务。
Condition接口
Condition接口描述可能会与锁有关联的条件变量,提供了更强大的功能,例如在线程的等待/通知机制上,Conditon可以实现多路通知和选择性通知。

2、使用案例

生产消费模式
写线程向容器中添加数据,读线程从容器获取数据,如果容器为空时,读线程等待。

public class LockAPI01 {
   
    private static Lock lock = new ReentrantLock() ;
    private static Condition condition1 = lock.newCondition() ;
    private static Condition condition2 = lock.newCondition() ;
    public static void main(String[] args) throws Exception {
   
        List<String> dataList = new ArrayList<>() ;
        ReadList readList = new ReadList(dataList);
        WriteList writeList = new WriteList(dataList);
        new Thread(readList).start();
        TimeUnit.SECONDS.sleep(2);
        new Thread(writeList).start();
    }
    // 读数据线程
    static class ReadList implements Runnable {
   
        private List<String> dataList ;
        public ReadList (List<String> dataList){
   
            this.dataList = dataList ;
        }
        @Override
        public void run() {
   
            lock.lock();
            try {
   
                if (dataList.size() != 2){
   
                    System.out.println("Read wait...");
                    condition1.await();
                }
                System.out.println("ReadList WakeUp...");
                for (String element:dataList){
   
                    System.out.println("ReadList:"+element);
                }
                condition2.signalAll();
            } catch (InterruptedException e){
   
                e.fillInStackTrace() ;
            } finally {
   
                lock.unlock();
            }
        }
    }
    
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值