栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Reentrantlock

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Reentrantlock

ReentrantLock 是一种可重入的排它锁,主要用来解决多线程对共享资源竞争的问题。可以保证有序性、可见性、原子性。

这个类在java.util.concurrent.locks包下面。

​​​​​​​

特点:
  1. 不会自动释放锁,可能会造成死锁,需要配合try finally进行释放锁。
  2. 可以通过Condition绑定多个条件,从而实现选择性通知
  3. 支持公平和非公平特性(默认是非公平)
  4. 它支持可重入,也就是获得锁的线程在释放锁之前再次去竞争同一把锁的时候,不需要加锁就可以直接访问。
  5. 用的是乐观锁机制。控制锁的代码由用于自定义,也采用CAS自旋锁进行了优化。
  6. 属于API层面,底层使用CAS和AQS实现,需要 lock() 和 unlock() 方法配合 try/finally 语句块来完成

实现原理

锁的竞争

ReentrantLock 是通过互斥变量,使用 CAS 机制来实现的。

没有竞争到锁的线程,使用了 AbstractQueuedSynchronizer 这样一个队列同步器来存储,底层是通过双向链表来实现的。当锁被释放之后,会从 AQS 队列里面的头部唤醒下一个等待锁的线程。

公平和非公平的特性

主要是体现在竞争锁的时候,是否需要判断 AQS 队列存在等待中的线程。

锁的重入特性

在 AQS 里面有一个成员变量来保存当前获得锁的线程,当同一个线程下次再来竞争锁的时候,就不会去走锁竞争的逻辑,而是直接增加重入次数。

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1017266.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号