09-深入理解AQS之独占锁ReentrantLock源码分析【TL 并发 09】

juc包下AQS

await之后进入条件等待队列,singal/signalAll之后进入同步等待队列

加锁解锁只与同步等待队列有关

ReentrantLock解决线程安全问题

竞争不够激烈使用synchronized(轻量级锁完全在用户态执行,不用阻塞线程 cas很多次阻塞线程) 竞争激烈使用ReentrantLock(只要有竞争就会阻塞线程、会有一次cas成功率低)

cas乐观锁

java里面实现数组有两种实现:1、数组2、链表3、堆

悲观锁:很悲观别人一定会来抢我的,一定要上一把锁一定要阻塞住

乐观锁:cas 数据库版本号

自旋:cas 不停地尝试去获取锁

非自旋: 直接阻塞 很重的操作

中断:调用这个线程的中断方法,加锁的逻辑里面能对中断标记有判断,读到中断标记可以终止线程

不可中断:没有去判断这个线程是否有中断标记

可重入锁:同一个锁对象,再次进入,不会阻塞住持有锁的线程

不可重入锁:

共享锁:tryAcquireShared 信号量 资源与线程

独占锁:

非公平锁效率高

  • synchronized是JVM层次的锁实现,ReentrantLock是JDK层次的锁实现;
  • synchronized的锁状态是无法在代码中直接判断的,但是ReentrantLock可以通过ReentrantLock#isLocked判断;
  • synchronized是非公平锁,ReentrantLock是可以是公平也可以是非公平的;
  • synchronized是不可以被中断的,而ReentrantLock#lockInterruptibly方法是可以被中断的;
  • 在发生异常时synchronized会自动释放锁,而ReentrantLock需要开发者在finally块中显式释放锁;
  • ReentrantLock获取锁的形式有多种:如立即返回是否成功的tryLock(),以及等待指定时长的获取,更加灵活;
  • synchronized在特定的情况下对于已经在等待的线程是后来的线程先获得锁(回顾一下sychronized的唤醒策略),而ReentrantLock对于已经在等待的线程是先来的线程先获得锁;
相关推荐
letisgo52 小时前
JAVA 高级进阶18篇《生产级RAG:切分、检索、评估与Graph RAG全链路实战》
java·面试·检索增强·rag·graph rag
随遇而安zx2 小时前
【并发】---Disruptor 原理、源码与实战 深度解析
java·并发·disruptor
Lyyaoo.2 小时前
【二分查找】【困难】寻找两个有序数组的中位数
java·数据结构·算法
小羊没烦恼!2 小时前
Memory 记忆设计讨论:Agent Memory 的安全边界:权限、删除、版本与回执
java·大数据·word·powerpoint·.net
这是程序猿2 小时前
Java线程池深度剖析:源码原理、核心参数、任务调度与生产调优实战
java·开发语言·python
rannn_1112 小时前
【Java面试八股】Java基础篇|数据类型、面向对象、关键字、反射、注解、异常、新特性、序列化、设计模式、IO
java·后端·面试
quantdash_cc2 小时前
从数据采集到策略消费,股票日内行情管道应该怎么设计?
开发语言·python·数据分析·量化交易·股票数据·quantdash
MacroZheng2 小时前
阿里又开源了一个神级 Skill 项目!
java·人工智能·后端
郝学胜-神的一滴3 小时前
C++20模板元编程 01:从零吃透模板核心底层逻辑
开发语言·c++·vscode·程序人生·开源