java多线程(4) ----- Lock的使用
(欢迎关注微信公众号:深入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的使用相关推荐
- Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock
在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...
- JAVA多线程-基础Lock Condition 并发集合
代码的逻辑: 1)SProducer不停的产生number到queue中. 2)3个carrier不停的取出queue中的number. 3)如果queue中存在10个剩余number时,SProdu ...
- java 多线程 一个博客
http://blog.csdn.net/a352193394/article/category/2563875 Java多线程之~~~线程安全容器的非阻塞容器 在并发编程中,会经常遇到使用容器.但是 ...
- bat 等大厂常问的Java多线程面试题,3万字解析
1 基本概括 2 文章详情 1.1 Java基础--Java多线程(进程与线程的介绍) 1.2 Java基础--Java多线程(线程的创建方式) 1.3 Java基础--Java多线程(什么是进程?) ...
- Java多线程:线程间通信之Lock
Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...
- Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信
前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...
- Java多线程:synchronized | Volatile 和Lock和ReadWriteLock多方位剖析(一)
前言 本文站在多线程初中级学习者的角度,较为全面系统的带你一起了解多线程与锁相关的知识点.带你一起解开与锁相关的各种概念.用法.利弊等.比如:synchronized.Volatile.Lock.Re ...
- Java多线程同步之使用Lock实现车辆入库出库管理
Java多线程同步之使用Lock实现车辆入库出库管理 个人笔记: 实现:车库有n个车位,现在有m辆车试图进入车库,每辆车停留随机秒数后离开 首先创建一个Garage车库类,Garage有空间属性和最大 ...
- 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
最新文章
- conda下载出现连接超时怎么办
- 从LXMERT到VLMO:多模态预训练模型的演变史
- 实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI
- 软概(lesson 2):课堂测试
- java for i i 区别,i ++amp;和i ++之间的区别是什么? ++我在for循环(Java)?
- 量子艺术、魔法成像、水生政治、性方程式……这些AI“衍生”科目都是啥?...
- centos7部署gitlab遇到的坑
- clearinterval函数不生效_excel有没有一种技巧或函数让你相见恨晚,如果没有请看这篇文章...
- MAC上安装JDK后的所在目录
- [转载]下载网页中的ts视频文件
- css控制图片自适应大小
- 虚幻5会对行业产生什么重大变化影响?
- PID参数整定口诀与经验法整定PID参数
- Android上的滤镜效果
- 当我说转行大数据工程师时,众人笑我太疯癫,直到四个月后......
- python量化分析岗位_量化金融有哪些职位可以选择?
- 计算机的简单英文单词怎么写,笔记本的英文单词怎么写翻译是什么
- E-PUCK机器人-例子
- mybatis自动识别数据库关键字
- 原油有所反弹但空间依然不大