Java中的锁(synchronized、Lock、ReadWriteLock)及常用线程安全类原理(CopyOnWriteArrayList、ConcurrentHashMap)

目录

1、synchronized

自旋锁和互斥锁区别

自旋锁的实现

2、Lock

AQS: 队列同步器

CAS:Compare-And-Swap比较并交换

3、synchronized与Lock区别

4、补充锁的一些概念

偏向锁

可重入锁

5、线程安全类

常见类的线程安全类


参考了这篇文章,围绕这篇文章扩展和整理:

总结:Java中的锁_小魏的博客的博客-CSDN博客_java中的锁

1、synchronized

底层是通过 Monitor 实现的,Monitor 是在 JVM 底层实现的,底层代码是 C++。

synchronized的锁会经历:无锁、偏向锁、轻量级锁(自旋锁)、重量级锁(悲观锁)。

(锁升级过程不可逆)

锁的信息存于对象头,synchronized是否要升级锁,会根据对象头中的锁信息判断。

偏向锁:当没有其他线程竞争(只有一个线程在竞争同步块时), 那么当前锁就是偏向锁;
轻量级锁(自旋锁):当存在多个线程竞争锁, 锁就会从偏向锁升级为轻量级锁;
重量级锁(互斥锁):在升级到轻量级锁后,未抢到锁的线程会自旋等待锁的释放。会消耗CPU资源, 所以Java设置了轻量级锁自旋次数限制 默认10次(通过-XX:PreBlockSpin 设置),当自旋超过10次就会升级为重量级锁。

自旋锁和互斥锁区别

自旋锁:一直占用着CPU,在未获得锁的情况下,一直运行(自旋),性能高,但是废资源,适合等待时间短,并发量不高的情况;
互斥锁:进入内核态的线程阻塞,唤醒时性能低下,适合在等待时间长的情况下使用。

自旋锁的实现

CAS是自旋锁的一种实现方式(CAS是乐观锁的一种实现方式)

CAS有三个操作值:
内存值V、预期值A与修改值B。

根据CAS自己写一个自旋锁:

CAS与自旋锁_皮卡P的博客-CSDN博客_自旋锁和cas的区别

2、Lock

Lock 是接口,实现类有: ReentrantLock,ReentrantReadWriteLock.ReadLock,ReentrantReadWriteLock.WriteLock

常用的就是ReentrantLock。

Ree

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码与咖啡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值