Java中的锁策略

2023-12-16 12:32:52

1 乐观锁 vs 悲观锁

锁的实现者预测当前锁冲突的概率,可分为乐观锁和悲观锁。

乐观锁:发生冲突的概率较小;主要使用在读操作较多的情况下。

悲观锁:发生冲突的概率较大;主要使用在写操作较多的情况下。

2 轻量级锁 vs 重量级锁

轻量级锁:加锁解锁,速度更快,更高效;

重量级锁:加锁解锁,速度更慢,更低效。

一般情况下,乐观锁可能是轻量级锁,悲观锁可能是重量级锁。

3 自旋锁 vs 挂起等待锁

自旋锁:是轻量级锁的一种典型实现。

一旦锁被释放,即可得到锁。

通常是纯用户态,不需要经过内核态(时间相对较短)

挂起等待锁:是重量级锁的一种典型实现。

通过内核的状态,实现挂起等待(时间相对较长)

4 互斥锁 vs 读写锁

互斥锁:只是单纯的加锁,没有细分;

读写锁:分为读锁和写锁。

读写锁分为:

1)读锁和读锁之间,不会产生锁竞争

2)读锁和写锁之间,会产生锁竞争;

3)写锁和写锁之间,会产生锁竞争。

5 可重入锁 vs 不可重入锁

一个线程针对一把锁,连续加锁两次,出现死锁就是不可重入锁,不发生死锁就是可重入锁。

产生死锁的必要条件:

1互斥使用:一个线程拿到锁后,另外一个线程不可再使用。

2 不可抢占:一个线程拿到锁后,只能自己释放,其他线程不能抢占。

3 请求和保持。

4 循环等待。

6 公平锁 vs 非公平锁

约定:遵循 先来后到 的锁称为公平锁,不遵循 先来后到?的锁称为非公平锁。

系统对于线程的调度是随机的,自带的synchronized锁是非公平的。如果想成为公平锁,则需要在synchronized基础上,利用队列来记录加锁线程的顺序。

注:

synchronized的特点:

1 synchronized既是乐观锁,又是悲观锁;

2 既是轻量级锁,又是重量级锁;

3 轻量级锁基于自旋锁实现,而重量级锁基于挂起等待锁实现;

4 synchronized不是读写锁;

5 synchronized是可重入锁;

6 synchronized是非公平锁。

文章来源:https://blog.csdn.net/qq_58098264/article/details/134799019
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。