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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!