总结锁策略, cas 和 synchronized 优化过程

一,常见的锁策略

1.悲伤锁vs乐观锁

加锁的时候,预测当前锁冲突的概率大还是小。

如果大,就是悲观锁,因为后续的工作更多,加锁开销就更大

反之则是乐观锁,加锁开销小。

在java中synchronized是一种自适应锁,它可以自动计算出概率大小,自动采取那种锁来执行,还是很高效的。

2.轻量级锁vs重量级锁

一般来说悲观锁就是重量级锁,乐观锁就是轻量级锁。

加锁过程中做的事情多,就是重量级锁,做的事情少,就是轻量级锁。

但要注意,在实际开发过程中,这两种锁可能是混用的

3.自旋锁vs挂起等待锁

自旋锁也是轻量级锁的一种实现方式

就是如果锁被占用,它就一直循环,直到别人释放锁之后,才停止,会浪费CPU资源,但会在第一时间拿到锁,

挂起等待锁就是重量级锁的一种实现方式

借助系统中的线程调度机制,尝试加锁,锁被占用了,这时就会挂起,(阻塞状态),此时线程就不会参与调度了,当锁释放了之后,系统就开始唤醒,去重新尝试获得锁,消耗的时间更长,但线程一旦阻塞,啥时候被唤醒,都不一定,不可控,所以拿到锁的时间更慢,但节省cpu。

4.可重入锁vs不可重入锁

也就是一个线程能不能被加锁多次还不会死锁就是可重入锁,反之则是不可重入锁

比如synchronized可以针对一个线程连续加锁两次,也不会死锁,这就是可重入锁

也比如在c++中的std::mutex就不能连续加锁两次,不然就会死锁,也就是不可重入锁。

5.公平锁vs不公平锁

 首先说一下在锁这边的公平定义,也就是按照先来后到这样的就算是公平,而随机选取这种锁调度则是不公平的。

公平锁也就是严格按照先来后到的顺序获取锁,那个线程等待的时间长,那个线程就先获得锁。

非公平锁是各凭本事,随机获取,跟时间没有关系。

synchronized就是非公平锁,它就是随机获取,概率都是相同的,不是你先创建锁就归你那种。

6.互斥锁vs读写锁

互斥锁,顾名思义,就是两边是互斥的,比如在多线程中共享资源,想要访问同一资源的时候,互斥锁就会把这个资源锁定,让其他线程阻塞。

而读写锁其实是一种特殊的互斥锁,它允许一起读,但不能一起改,也不能一个读,一个写。也就是可以一起读,但只能一个线程去写。

二.synchronized实现原理

synchronized是悲观锁也是乐观锁,是轻量级也是重量级,轻量级是自旋锁,重量是挂起等待锁实现,是可重入锁,不是读写锁,是非公平锁。

1.锁升级

这里演示一下synchronized的自适应锁升级过程:

1.一开始还没有加锁的状态——>  代码中开始调用synchronized——>2.先成为偏向锁——>遇到锁冲突——>3.轻量级锁——>冲突在进一步提升——>4.变为重量级锁

这边解释一下偏向锁,偏向锁也就是偏向一个锁好像,但并不是真的锁,而只是一个标记,就比如你和异性朋友的暧昧,但没有确立关系一样。

这个过程是不可逆的,变为重量级之后是不会在变为轻量级的。

2.锁消除 

也就是你加锁了,但编译器这边一看,这里不需要锁啊,就自动把你的锁删掉了,也就是优化掉,因为这样可以提高效率

3.锁粗化

注意,这边的粗化说的是锁的粒度,也就是加锁的范包含多少的代码,包含的越多,粒度也越粗,反之则越细。其实这也是编译器的一种优化策略,比如你在一些逻辑中频繁加锁,编译器一看这么多细粒度的锁,直接给你优化成一个粗粒度的锁,一个锁就结束了,效率也就更高了。

就比如一个电话说清楚的事情,你打了三次,肯定效率低嘛。

三,CAS(compare  and  swap)比较和交换

cas是一个cpu指令(原子的),就可以完成比较和交换,这样就不需要额外的锁,就更大的提高效率。CAS涉及到三个操作——内存位置(V),预期的原值(A)和新值(B)

CAS的工作流程:一开始先比较V和A是否相等,如果相等,那么就将这个位置的值更新为B,并返回true,如果不相等,就不变并返回false。

在多线程中CAS是非常厉害的,它可以在不阻塞其他线程的情况下,避免发生冲突,就比如多个线程想修改同一变量的时候,它可以保证只有一个线程可以修改,也就是只有V和A相等的线程。

但它也有很多缺点,就比如在这次CAS操作失败了,它就会在空转,带来了额外的开销。

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值