3.并发编程-ReentrantLock 细节说明
并发编程-ReentrantLock 细节说明
---
title: 并发编程-ReentrantLock 细节说明
date: 2018-07-05 09:06:57
categories:
- 并发编程
---
<Excerpt in index | 首页摘要>
<!-- more -->
- 本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:
- ReentrantLock介绍
- ReentrantLock函数列表
- ReentrantLock示例
<The rest of contents | 余下全文>
并发编程-ReentrantLock介绍 细节说明
1. ReentrantLock-是一个可重入的互斥锁,又被称为“独占锁”
* ReentrantLock
* ReentrantLock锁在同一个时间点只能被一个线程锁持有;而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取。
* ReentrantLock分为“公平锁”和“非公平锁”。它们的区别体现在获取锁的机制上是否公平。“锁”是为了保护竞争资源,防止多个线程同时操作线程而出错,ReentrantLock在同一个时间点只能被一个线程获取(当某线程获取到“锁”时,其它线程就必须等待);ReentraantLock是通过一个FIFO的等待队列来管理获取该锁所有线程的。在“公平锁”的机制下,线程依次排队获取锁;而“非公平锁”在锁是可获取状态时,不管自己是不是在队列的开头都会获取锁。
- [x] ReentrantLock 类方法简介
- // 创建一个 ReentrantLock ,默认是“非公平锁”。
- ReentrantLock()
- // 创建策略是fair的 ReentrantLock。fair为true表示是公平锁,fair为false表示是非公平锁。
- ReentrantLock(boolean fair)
- // 查询当前线程保持此锁的次数。
- int getHoldCount()
- // 返回目前拥有此锁的线程,如果此锁不被任何线程拥有,则返回 null。
- protected Thread getOwner()
- // 返回一个 collection,它包含可能正等待获取此锁的线程。
- protected Collection<Thread> getQueuedThreads()
- // 返回正等待获取此锁的线程估计数。
- int getQueueLength()
- // 返回一个 collection,它包含可能正在等待与此锁相关给定条件的那些线程。
- protected Collection<Thread> getWaitingThreads(Condition condition)
- // 返回等待与此锁相关的给定条件的线程估计数。
- int getWaitQueueLength(Condition condition)
- // 查询给定线程是否正在等待获取此锁。
- boolean hasQueuedThread(Thread thread)
- // 查询是否有些线程正在等待获取此锁。
- boolean hasQueuedThreads()
- // 查询是否有些线程正在等待与此锁有关的给定条件。
- boolean hasWaiters(Condition condition)
- // 如果是“公平锁”返回true,否则返回false。
- boolean isFair()
- // 查询当前线程是否保持此锁。
- boolean isHeldByCurrentThread()
- // 查询此锁是否由任意线程保持。
- boolean isLocked()
- // 获取锁。
- void lock()
- // 如果当前线程未被中断,则获取锁。
- void lockInterruptibly()
- // 返回用来与此 Lock 实例一起使用的 Condition 实例。
- Condition newCondition()
- // 仅在调用时锁未被另一个线程保持的情况下,才获取该锁。
- boolean tryLock()
- // 如果锁在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁。
- boolean tryLock(long timeout, TimeUnit unit)
- // 试图释放此锁。
- void unlock()
2. ReentrantLock-示例 说明
* lock和unlock的作用
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- // LockTest1.java
- // 仓库
- class Depot {
- private int size; // 仓库的实际数量
- private Lock lock; // 独占锁
- public Depot() {
- this.size = 0;
- this.lock = new ReentrantLock();
- }
- public void produce(int val) {
- lock.lock();
- try {
- size += val;
- System.out.printf("%s produce(%d) --> size=%d\n",
- Thread.currentThread().getName(), val, size);
- } finally {
- lock.unlock();
- }
- }
- public void consume(int val) {
- lock.lock();
- try {
- size -= val;
- System.out.printf("%s consume(%d) <-- size=%d\n",
- Thread.currentThread().getName(), val, size);
- } finally {
- lock.unlock();
- }
- }
- };
- // 生产者
- class Producer {
- private Depot depot;
- public Producer(Depot depot) {
- this.depot = depot;
- }
- // 消费产品:新建一个线程向仓库中生产产品。
- public void produce(final int val) {
- new Thread() {
- public void run() {
- depot.produce(val);
- }
- }.start();
- }
- }
- // 消费者
- class Customer {
- private Depot depot;
- public Customer(Depot depot) {
- this.depot = depot;
- }
- // 消费产品:新建一个线程从仓库中消费产品。
- public void consume(final int val) {
- new Thread() {
- public void run() {
- depot.consume(val);
- }
- }.start();
- }
- }
- public class LockTest1 {
- public static void main(String[] args) {
- Depot mDepot = new Depot();
- Producer mPro = new Producer(mDepot);
- Customer mCus = new Customer(mDepot);
- mPro.produce(60);
- mPro.produce(120);
- mCus.consume(90);
- mCus.consume(150);
- mPro.produce(110);
- }
- }
运行结果
- Thread-0 produce( 60) --> left= 0, inc= 60, size= 60
- Thread-1 produce(120) --> left= 80, inc= 40, size=100
- Thread-2 consume( 90) <-- left= 0, dec= 90, size= 10
- Thread-3 consume(150) <-- left=140, dec= 10, size= 0
- Thread-4 produce(110) --> left= 10, inc=100, size=100
- Thread-3 consume(150) <-- left= 40, dec=100, size= 0
- Thread-4 produce(110) --> left= 0, inc= 10, size= 10
- Thread-3 consume(150) <-- left= 30, dec= 10, size= 0
- Thread-1 produce(120) --> left= 0, inc= 80, size= 80
- Thread-3 consume(150) <-- left= 0, dec= 30, size= 50
3.并发编程-ReentrantLock 细节说明的更多相关文章
- 5.并发编程-synchronized 细节说明
并发编程-synchronized 细节说明 1. synchronized-锁重入 & 异常释放锁 说明 * 关键字synchronized 拥有锁重入的功能,也就是在使用synchroni ...
- Java并发编程-ReentrantLock
代码示例: Lock lock = new ReentrantLock(); lock.lock(); try { // update object state } finally { lock.un ...
- Java并发编程-ReentrantLock源码分析
一.前言 在分析了 AbstractQueuedSynchronier 源码后,接着分析ReentrantLock源码,其实在 AbstractQueuedSynchronizer 的分析中,已经提到 ...
- Java并发编程 ReentrantLock 源码分析
ReentrantLock 一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大. 这个类主要基于AQS(Abst ...
- 并发编程实践五:ReentrantLock
ReentrantLock是一个可重入的相互排斥锁,实现了接口Lock,和synchronized相比,它们提供了同样的功能.但ReentrantLock使用更灵活.功能更强大,也更复杂.这篇文章将为 ...
- java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock
原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析
前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介
注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述.本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的l ...
- Java并发编程总结3——AQS、ReentrantLock、ReentrantReadWriteLock(转)
本文内容主要总结自<Java并发编程的艺术>第5章——Java中的锁. 一.AQS AbstractQueuedSynchronizer(简称AQS),队列同步器,是用来构建锁或者其他同步 ...
随机推荐
- ubuntu 安装 TensorFlow、opencv3 的 tips
安装tensorflow: 创建tensorflow虚拟环境 conda create -n tensorflow python=2.7 输入命令查看可用版本的tensorflow-gpu cond ...
- 140. 后缀数组(hash + 二分 / 后缀数组)
题目链接 : https://www.acwing.com/problem/content/description/142/ Hash + 二分 #include <bits/stdc++.h& ...
- ElasticSearch5.3安装IK分词器并验证
ElasticSearch5.3安装IK分词器 之前使用Elasticsearch安装head插件成功了,但是安装IK分词器却失败了.貌似是ElasticSearch5.0以后就不支持直接在elast ...
- centos7配置fastdfs集群(5.09)
centos7配置fastdfs集群(5.09) 2017年03月10日 23:34:26 带鱼兄 阅读数 1564 版权声明:本文为博主原创文章,转载请注明出处. https://blog.c ...
- numpy中的argsort()函数
在阅读<机器学习实战>一书中,发现了一个比较函数是argsort() 猜测是在numpy中出现的,手动进行了测试 >>> import numpy as np >& ...
- 删除表A的记录时,Oracle 报错:“ORA-02292:违反完整约束条件(XXX.FKXXX)- 已找到子记录
1.找到以”FKXXX“为外键的表A的子表,直接运行select a.constraint_name, a.table_name, b.constraint_name from user_constr ...
- tensorboard_embedding
from tensorboardX import SummaryWriter import torchvision writer=SummaryWriter(log_dir="embeddi ...
- 你可能用到的Spring工具类?
现在绝大部分项目都已经拥抱Spring生态,掌握Spring常用的工具类,是非常重要,零成本增加编码效率. 一.常用工具类 ObjectUtils org.springframework.util.O ...
- N皇后问题的递归与非递归解法
都在注释里了: public class NQueen { public static void main(String[] args) { Scanner sc = new Scanner(Syst ...
- form表单和CSS
一.form表单 1. form表单有什么用 能够获取用户输入的信息(输入,选择, 上传的文件),并且将这些数据全部发送给后端 2. form表单的用法 (1)有两个重要参数: action : 控制 ...