---
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
来源: http://www.bubuko.com/infodetail-2854106.html