当前位置: 代码迷 >> 综合 >> JUC---ReentrantLock
  详细解决方案

JUC---ReentrantLock

热度:19   发布时间:2023-12-26 16:06:31.0

边记录,边学习,每天进步一点点。

1. ReentrantLock特点

ReentrantLock可重入锁,基于AQS,可以等同于synchronized使用;它提供了更强大、灵活的锁机制。

可重入概念:
子程序正在运行时,可以再次进入并执行它。

ReentrantLock还提供了公平锁与非公平锁机制,可以通过构造函数来指定,默认为非公平锁。
公平锁的锁获取是有序的,但在效率上不及非公平锁高。
公平锁简单理解就是排队,讲究先入先出原则。
在这里插入图片描述在这里插入图片描述

从锁获取源码来看,公平锁增加了是否有前元素的检查;而非公平锁没有;

Synchronized不相应中断,获取不到就一直阻塞;ReentrantLock可以响应中断。

2. ReentrantLock常用方法介绍

ReentrantLock提供了以下获取锁的方法:
(1)lock()
在这里插入图片描述
锁可用状态下,并且当前线程未持有锁,直接获取锁,并把count设置为1;
锁可用状态下,并且当前线程持有锁,直接获取锁,并把count值加1;
锁不可用状态下,那么当前线程阻塞,休眠到获取锁为止,然后把count设置为1;

这种状况下,锁获取不可中断,获取不到就一直休眠等待,有点恐怖。

(2)tryLock()
在这里插入图片描述在这里插入图片描述
获取锁时,该锁没有被其他线程持有,才获取锁,同时返回true,并将count设置为1;
获取锁时,当前线程已持有该锁,并且锁可用时,返回true,并将count值加1;
获取锁时,发现其他线程持有该锁,锁不可用,直接返回false,当前线程无须阻塞,可以先做别的事情;

使用tryLock获取锁都是非公平方式,即使该锁是公平锁;
这种状况,拿到就返回true,不然就返回false,比较直接。

(3)tryLock(long timeout, TimeUnit unit)
在这里插入图片描述在这里插入图片描述在这里插入图片描述
当获取锁时,锁在设定的超时时间范围内可用,并在等待期间没有中断,则当前线程成功获取锁,返回true,并将count设置为1;
获取锁时,锁在设定时间范围内不可用,则获取失败,不再继续等待,返回false。
获取锁时,等待期间中断了,抛出InterruptedException,不再继续等待;
获取锁时,锁在设定时间范围内可用,且当前线程已持有该锁,那么成功获取锁,并将count值加1;

这种状况,拿到就返回true,不然就等待一段时间,超时返回false,聪明;

(4)lock.lockInterruptibly()
在这里插入图片描述在这里插入图片描述在这里插入图片描述
获取锁时,锁可用,则当前线程成功获取锁,并将count设置为1;
获取锁时,锁可用,且当前线程已持有该锁,则成功获取锁,并将count加1;
获取锁时,锁不可用,当前线程进行阻塞等待,等待期间如果有中断事件,就停止等待;
获取锁时,锁不可用,当前线程阻塞等待,等待期间发现锁可用了,则成功获取锁,并将count设置为1;

这种状况,是响应中断异常。

3. 线程的打断机制

(1)线程在sleep或wait,join,此时如果别的进程调用此进程的 interrupt()方法,此线程会被唤醒并被要求处理InterruptedException;
(2)此线程在运行中, 则不会收到提醒。但是 此线程的 “打扰标志”会被设置, 可以通过isInterrupted()查看并 作出处理。