(欢迎关注微信公众号:深入Java底层)

4.1使用ReentrantLock类

调用ReentrantLock对象的lock()方法获取锁,调用unlock()方法释放锁,效果和使用synchronized关键字一样。

Object类中的wait()方法相当于Condition类中的await()方法。在condition. await()方法调用之前需要先调用lock.lock()代码获得同步器。

Object类中的wait(longtimeout)方法相当于Condition类中的await(longtime,TimeUnit unit)方法。

Object类中的notify()方法相当于Condition类中的signal()方法。

Object类中的notifyAll()方法相当于Condition类中的signalAll()方法。

使用ReentrantLock对象(准确说是Condition()对象)可以唤醒指定种类的线程,对线程执行的业务进行排序规划。

方法getHoldCount()、getQueueLength()和getWaitQueueLength()的测试

1)  方法int getHoldCount()的作用是查询当前线程保持此锁定的个数,也就是调用lock()方法的次数。

2)  方法int getQueueLength()的作用是返回正等待获取此锁锁定的线程估计数,比如有5个线程,1个线程首先执行await()方法,那么在调用getQueueLength()方法后返回值是4,说明有4个线程同时在等待lock的释放。

3)  方法int getWaitQueueLength(Conditioncondition) 的作用是返回等待与此锁定相关的给定条件Condition的线程估计数,比如有5个线程,每个线程都执行了同一个condition对象的await()方法,则调用getWaitQueueLength(Conditioncondition)方法时返回的int值是5。

方法hasQueueThread()、hasQueueThreads()和hasWaiters()的测试

1)        方法boolean hasQueueThread(Thread thread)的作用是查询指定的线程是否正在等待获取此锁定。

2)        方法boolean hasQueueThreads的作用是查询是否有线程正在等待获取此锁定。

3)        方法boolean hasWaiters(Conditioncondition)的作用是查询是否有线程正在等待与此锁定有关的condition条件。

方法isFair ()、isHeldByCurrentThread()和isLocked()的测试

1)        方法boolean isFair()的作用是判断是不是公平锁。在默认情况下,ReentrantLock类使用的是非公平锁。

2)        方法boolean isHeldByCurrentThread()的作用是查询当前线程是否保持此锁定。

3)        方法boolean isLocked()的作用是查询此锁定是否由任意线程保持。

方法lockInterruptibly()、tryLock()和tryLock(long timeout,TimeUnit unit)的测试

1)        方法void lockInterruptibly()的作用是:如果当前线程未被中断,则获取锁定,如果已经被中断则出现异常。

2)        方法boolean tryLock()的作用是,仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定。

3)        方法boolean tryLock(long timeout, TimeUnit unit)的作用是,如果锁定在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁定。

方法awaitUninterruptibly()的使用

void awaitUninterruptibly();

//调用该方法的前提是,当前线程已经成功获得与该条件对象绑定的重入锁,否则调用该方法时会抛出IllegalMonitorStateException。

//调用该方法后,结束等待的唯一方法是其它线程调用该条件对象的signal()或signalALL()方法。等待过程中如果当前线程被中断,该方法仍然会继续等待,同时保留该线程的中断状态。

方法awaitUntil()的使用

long awaitNanos(longnanosTimeout) throws InterruptedException;

//调用该方法的前提是,当前线程已经成功获得与该条件对象绑定的重入锁,否则调用该方法时会抛出IllegalMonitorStateException。

//nanosTimeout指定该方法等待信号的的最大时间(单位为纳秒)。若指定时间内收到signal()或signalALL()则返回nanosTimeout减去已经等待的时间;

//若指定时间内有其它线程中断该线程,则抛出InterruptedException并清除当前线程的打断状态;若指定时间内未收到通知,则返回0或负数。

boolean awaitUntil(Date deadline) throwsInterruptedException;

//适用条件与行为与awaitNanos(long nanosTimeout)完全一样,唯一不同点在于它不是等待指定时间,而是等待由参数指定的某一时刻。

4.2 使用ReentrantReadWriteLock类

读写锁表示有两个锁,一个是读操作相关的锁,也称为共享锁;另一个是写操作相关的锁,也叫排他锁。也就是多个读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥。

(欢迎关注微信公众号:深入Java底层)

java多线程(4) ----- Lock的使用相关推荐

  1. Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock

    在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...

  2. JAVA多线程-基础Lock Condition 并发集合

    代码的逻辑: 1)SProducer不停的产生number到queue中. 2)3个carrier不停的取出queue中的number. 3)如果queue中存在10个剩余number时,SProdu ...

  3. java 多线程 一个博客

    http://blog.csdn.net/a352193394/article/category/2563875 Java多线程之~~~线程安全容器的非阻塞容器 在并发编程中,会经常遇到使用容器.但是 ...

  4. bat 等大厂常问的Java多线程面试题,3万字解析

    1 基本概括 2 文章详情 1.1 Java基础--Java多线程(进程与线程的介绍) 1.2 Java基础--Java多线程(线程的创建方式) 1.3 Java基础--Java多线程(什么是进程?) ...

  5. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  6. Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信

    前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  7. Java多线程:synchronized | Volatile 和Lock和ReadWriteLock多方位剖析(一)

    前言 本文站在多线程初中级学习者的角度,较为全面系统的带你一起了解多线程与锁相关的知识点.带你一起解开与锁相关的各种概念.用法.利弊等.比如:synchronized.Volatile.Lock.Re ...

  8. Java多线程同步之使用Lock实现车辆入库出库管理

    Java多线程同步之使用Lock实现车辆入库出库管理 个人笔记: 实现:车库有n个车位,现在有m辆车试图进入车库,每辆车停留随机秒数后离开 首先创建一个Garage车库类,Garage有空间属性和最大 ...

  9. 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

最新文章

  1. conda下载出现连接超时怎么办
  2. 从LXMERT到VLMO:多模态预训练模型的演变史
  3. 实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI
  4. 软概(lesson 2):课堂测试
  5. java for i i 区别,i ++amp;和i ++之间的区别是什么? ++我在for循环(Java)?
  6. 量子艺术、魔法成像、水生政治、性方程式……这些AI“衍生”科目都是啥?...
  7. centos7部署gitlab遇到的坑
  8. clearinterval函数不生效_excel有没有一种技巧或函数让你相见恨晚,如果没有请看这篇文章...
  9. MAC上安装JDK后的所在目录
  10. [转载]下载网页中的ts视频文件
  11. css控制图片自适应大小
  12. 虚幻5会对行业产生什么重大变化影响?
  13. PID参数整定口诀与经验法整定PID参数
  14. Android上的滤镜效果
  15. 当我说转行大数据工程师时,众人笑我太疯癫,直到四个月后......
  16. python量化分析岗位_量化金融有哪些职位可以选择?
  17. 计算机的简单英文单词怎么写,笔记本的英文单词怎么写翻译是什么
  18. E-PUCK机器人-例子
  19. mybatis自动识别数据库关键字
  20. 原油有所反弹但空间依然不大

热门文章

  1. 联想拯救者Y7000加装内存条
  2. 表单输入框聚焦输入内容显示叉叉清除效果
  3. JAVA学习网址大全
  4. 《锦绣中华》中老年公益文旅游-走进佛山敬老院
  5. java中的LinkedList(链表)与ArrayList(动态数组):(1)简单辨析
  6. JAVA中传值与“传引用“辨析
  7. 学生机房随堂测试软件,如何使用随堂测试--立即测?
  8. Python随堂检测2
  9. 爬虫速成(一):前言
  10. Vitalik万字长文:困扰加密货币的硬核难题五年后都怎么样了?