锁的分类,各种锁的解释

1. 悲观锁和乐观锁:

悲观锁:

假设多个线程会发生竞争,因此在访问共享资源之前,先获取锁。ReentrantLock 是一个悲观锁的例子。

乐观锁:

假设多个线程不会发生竞争,直接进行操作,但在更新时检查是否有其他线程的干扰。CAS (Compare and Swap) 操作是一种乐观锁的实现方式。

2. 共享锁和排他锁:

共享锁:

多个线程可以同时获取共享锁,用于读取共享资源。例如,ReadWriteLock 接口中的读锁是共享锁的例子。

排他锁:

只有一个线程可以获取排他锁,用于更新共享资源。例如,ReentrantLock 接口中的写锁是排他锁的例子。

3. 可重入锁:

可重入锁(Reentrant Lock):

允许同一线程多次获得同一个锁。如果一个线程已经获得了某个锁,那么它可以继续多次获得这个锁而不被阻塞。Java中的 ReentrantLock 和 synchronized 关键字都是可重入锁。

4. 公平锁和非公平锁:

公平锁:

等待时间最长的线程优先获取锁,确保锁的获取是按照请求的顺序进行的。ReentrantLock 可以设置为公平锁。

非公平锁:

锁的获取是无序的,允许新的线程在等待队列中插队,有可能导致某些线程长期无法获取锁。ReentrantLock 默认是非公平锁。

5. 自旋锁:

自旋锁:

线程在获取锁时不立即阻塞,而是通过循环重试(自旋)来获取锁。自旋锁的优势在于避免了线程切换的开销,但如果锁竞争激烈,会导致CPU资源浪费。Java中的 Atomic 类使用了自旋锁。

6. 死锁和活锁:

死锁:

多个线程相互等待对方释放锁,导致所有线程无法继续执行。死锁通常是由于不恰当地使用多个锁或者锁的顺序不当引起的。

活锁:

多个线程在避免死锁的过程中,通过主动释放锁来避免死锁,但是由于竞争过于激烈,导致线程不断地抢夺锁,最终导致无法正常执行。

7. 分段锁:

分段锁:

将共享资源划分为多个段,每个段独立加锁,不同的线程可以同时访问不同的段。分段锁常用于对大规模数据结构的并发访问,如 ConcurrentHashMap。

这些锁的分类方式并不是互斥的,实际应用中可能会同时使用不同类型的锁以满足不同的需求。选择合适的锁取决于并发场景、性能需求和数据访问模式。
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

__WHOAMI

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

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

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

打赏作者

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

抵扣说明:

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

余额充值