【面试八股文 - java基础 - 多线程 - 锁】

系列文章目录

【面试八股文 - java基础 - 数据结构 - HashMap】
【面试八股文 - 数据库 - MySQL - 索引】



前言

人生而自由,但无往不在枷锁之中


一、 悲观锁VS乐观锁

1、synchronized

悲观锁就是我非常悲观的想,
我任何时候不看着我的东西,就有可能有人偷,
所以悲观锁是随时都在上锁状态,
最典型的就是Java关键字synchronized,
当资源被synchronized上锁,
则其他线程都无法访问该资源。

既然每次把重要资源都上锁不允许其他任何线程访问,
那么相对的,悲观锁的代价就是效率会相对降低

2、CAS

乐观锁就是要非常乐观的看事情,
我即使不看着我的东西,也不会有人偷,
那么只要我看到我的东西没发生变化,
就认为我的东西没人动过,
CAS就是乐观锁的思想,
compareAndSwap,即比较并交换,
将资源跟我之前看到的进行比较,
如果相同,那就认为该资源没有发生变化,
正常进行对资源进行交换(改变)操作。

乐观锁既然不看着资源,
任由其他线程可能操作,
一方面,如果其他线程确实操作了,
资源发现发生变化了,那就只能重新操作,
如果操作较复杂,可能期间资源又被修改,
导致反复进行操作而不能成功,
另一方面,是经典的ABA现象,
即另外的线程可能将资源A变成了B,
但短时间内将B又变回了A,
这种变化如果是简单的数值类型资源影响倒是不大,
但如果是带有内存地址等不好直接比较的属性,
可能未被比较的属性发生了变化而不知道,
所以通常下乐观锁进行比较时会加入版本号的概念,


二、锁升级

synchronized关键字,
前面也说了,最大问题就是效率问题,
所以JDK1.5就引入过锁升级来改进synchronized的效率

1、偏向锁

如果锁资源每次只被单个线程获取,
那么synchronized就非常简单的会让线程来获取资源,

2、轻量级锁

而当偏向锁生效时,有其他线程也同时请求资源,
这时候锁就不能简单的让其他线程也可以获取资源了,
这时候锁会升级成轻量级锁,
这时可以允许其他请求资源的线程保持请求状态,
如果锁施放了,就可以拿到锁。

3、重量级锁

但是如果轻量级锁状态,
请求资源的线程一直拿不到锁请求不到资源,
就说明这个资源是比较重要,非常抢手的,
这时候锁就升级成了重量级锁,
只有当前线程可以持有资源,
其他线程的请求都会被直接回绝


三、独占锁VS共享锁

独占,共享,
两个词很好理解,
但是锁就是拿到了资源进行上锁,
别人就无法再请求资源了,
这不就是独占么,这个共享又是怎么理解呢。

先说起因,独占锁很合理,但是有个问题,
资源的请求其实不光是修改,还有可能只是读取,
改数据的时候不能让别人插手,
防止改乱了,或者读错了,
那么如果大家都是读数据呢,
这时候,读写锁应运而生
这时候就很好理解了,
如果读数据,那就上读锁,
那其他人就也可以同时读数据,同时上读锁,
但如果想写数据,
不好意思,你得等现在在读数据的读完,
而写数据的时候,那就别人也不能读,也不能写了。


四、锁的公平性和可重入性

包括上面提到的共享,以及下面要说的公平性和可重入性,
其实都是Lock锁实现的过程,
在获取施放锁方法中通过简单调整得到的诸多锁形式而已

1、公平锁VS非公平锁

公平锁,何为公平,
大家都有相同机会获得锁资源,
那么先到先得即为公平,
锁施放后由等待队列中最先在等待的线程获取锁资源,
那不公平又当如何,
谁在使用,那么还由谁继续持有使用锁资源,
为什么要不公平对待各线程,
持有者继续持有,那么就减少了线程的切换,
从而提高程序效率

2、可重入锁

秘技丶望文生义
可重入锁,可重复进入的锁,
那么在什么情况下这个锁可重复进入呢,
在同一个线程里,
为防止死锁情况的发生,
是允许重复请求锁资源的,
Reentrant即为可重复的,
凡事以Reentrant开头的Lock锁都是可重入锁,
还有包括synchronized锁也是可重入锁


五、死锁

死锁,听名字就知道,
锁死了,解不开了,
那么为什么会解不开,

死锁产生的四大条件:
1.多线程需要相同资源
2.持有并保持
3.不可剥夺
4.循环等待

同时满足以上四个条件,
就会出现线程间相互等待情况,
无限制相互等待,
线程无法完成,也就不会施放自己持有的锁,
大家都不施放,也就形成了死锁情况。


总结

挖坑,挖坑,挖坑,多线程的锁其实内容还挺多的,我相信我后面会有时间对着源码把所有锁讲明白的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

破晓星芒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值