1、概念

ReentantLock继承接口 Lock 并实现了接口中定义的方法,他是一种可重入锁,除了能完成synchronized 所能完成的所有工作外,还提供了中断锁、定时锁等避免多线程死锁的方法。

ReentantLock可以创建多个Condition条件,通过await()和signal()方法实现等待和唤醒。

2、主要方法

  1. void lock(): 执行此方法时, 如果锁处于空闲状态, 当前线程将获取到锁. 相反, 如果锁已经被其他线程持有, 将一直等待直到当前线程获取到锁.
  2. boolean tryLock():如果锁可用, 则获取锁, 并立即返回 true, 否则返回 false. 该方法和
    lock()的区别在于, tryLock()只是"试图"获取锁, 如果锁不可用, 不会导致当前线程被挂起,当前线程仍然继续往下执行代码.
  3. void unlock():当前线程将释放持有的锁. 锁只能由持有线程释放.
  4. getHoldCount() :查询当前线程保持此锁的次数,也就是执行此线程执行lock方法的次数。
  5. getQueueLength():返回正等待获取此锁的线程估计数,比如启动 10 个线程,1 个线程获得锁,此时返回的是 9.
  6. hasQueuedThread(Thread thread):查询给定线程是否等待获取此锁
  7. hasQueuedThreads():是否有线程等待此锁
  8. isFair():该锁是否公平锁
  9. isLock():此锁是否有任意线程占用
  10. lockInterruptibly():如果当前线程未被中断,获取锁
  11. tryLock(long timeout TimeUnit unit):在给定等待时间内尝试获取锁,获取获得到则返回true,没有获取则返回flase.

3、Condition使用

Condition用时等待/通知,即当线程进行等待后,需要通知才能继续执行。
await()进入等待,signal()唤醒绑定Condition的第一个线程,signalAll()唤醒绑定Condition的所有线程。
比如: A、B两个线程轮流打印数字

public class Test {public static void main(String[] args) {Lock lock = new ReentrantLock();Condition conditionA = lock.newCondition();Condition conditionB = lock.newCondition();new Thread(() -> {try {for (int a = 1; a <= 10; a++) {// 上锁lock.lock();System.out.println("线程A打印数字:" + a);// 唤醒其他线程conditionB.signalAll();// 自身进入等待状态conditionA.await();}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}, "conditionA").start();new Thread(() -> {try {for (int a = 1; a <= 10; a++) {// 上锁lock.lock();System.out.println("线程B打印数字:" + a);// 唤醒其他线程conditionA.signalAll();// 自身进入等待状态conditionB.await();}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}, "conditionB").start();}
}

效果:

并发类编程—ReentrantLock(可重入锁)相关推荐

  1. Java并发编程-ReentrantLock可重入锁

    目录 1.ReentrantLock可重入锁概述 2.可重入 3.可打断 4.锁超时 5.公平锁 6.条件变量 Condition 1.ReentrantLock可重入锁概述 相对于 synchron ...

  2. 聊聊高并发(二十七)解析java.util.concurrent各个组件(九) 理解ReentrantLock可重入锁

    这篇讲讲ReentrantLock可重入锁,JUC里提供的可重入锁是基于AQS实现的阻塞式可重入锁.这篇 聊聊高并发(十六)实现一个简单的可重入锁 模拟了可重入锁的实现.可重入锁的特点是: 1. 是互 ...

  3. 1、Lock接口以及ReentrantLock可重入锁

    1.序 文章目录 1.序 2.Lock 接口 3.AbstractQueuedSynchronizer 3.1 双端队列 3.2 state变量 4.ReentrantLock简介以及其非公平锁模式 ...

  4. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  5. java condition_(原创)Java的ReentrantLock(可重入锁)下的Condition

    先来看一下这个Condition的使用场景,在LinkedBlockingQueue(链表的阻塞队列)类中包含如下的定义,通过使用lock.newCondition()方法,可以获得一个Conditi ...

  6. ReenTrantLock可重入锁(和synchronized的区别)总结

    ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也 ...

  7. 【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)

    在说锁之前,我们要明白为什么要加锁,不加锁会怎样? 在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题. 取钱的流程可以分为一下几个步骤: 1.用 ...

  8. Java 并发编程之可重入锁 ReentrantLock

    Java 提供了另外一个可重入锁,ReentrantLock,位于 java.util.concurrent.locks 包下,可以替代 synchronized,并且提供了比 synchronize ...

  9. java重入锁_java并发编程:可重入锁是什么?

    释义 广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁.ReentrantLock和sync ...

最新文章

  1. java 流的方式抓取网页 但是显示不全_用java抓取网页源代码时总是无法获取完整的源代码信息,求指导...
  2. Android游戏框架之基础之AA碰撞系统
  3. [css] 说下background-color:transparent和opacity:0的区别是什么?
  4. java字符串拼接_字符串拼接,什么时候会走StringBuilder?
  5. 浏览器的全屏功能小结
  6. python读取cad图纸_DWG文件信息的读取
  7. 赛道对比测试高尔夫6/7 全面解析后悬架
  8. python按字节读文件-使用Python进行二进制文件读写(转)
  9. 网站地图在线生成软件-只需要导入域名自动生成网站地图
  10. 系统服务器属于无形资产,企业管理系统是否属于无形资产?
  11. raid卡组不同raid_磁盘阵列卡组RAIDO 对比主板自带组磁盘阵列
  12. linux usb 从芯片,新人求教,怎么烧录Linux系统到一个小芯片上?
  13. 从前慢-深入理解JVM-篇章1
  14. 如何用教科书式的方法,着手分析一个行业?
  15. 【C/C++基础进阶系列】实战记录 -- Dump 文件生成与分析
  16. python分析txt文件_python解析文本文件
  17. Sky Computing
  18. 第一次使用linux电脑,计算机基础与Linux初次亲密接触第一天(马哥)
  19. PMP第四章:项目整合管理
  20. HTTP协议及TCP分析

热门文章

  1. (80)TCL脚本命令【string trimleft】
  2. .Net使用SandCastle生成API文档
  3. YARN 内存参数终极详解
  4. Metasploit图形界面Viper安装
  5. Python模块——shutil模块详解
  6. selectkey、插入成功返回主键
  7. 对不起,我给大家丢人了!开发三年只拿到美团、京东、阿里三个大厂offer
  8. 史上最全 40 道 Dubbo 面试题及答案
  9. 《C++ Primer Plus》第18章:探讨 C++ 新标准(9)
  10. css实现横向滚动条