继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java多线程(6):锁与AQS(上)

湘王爱娟娟
关注TA
已关注
手记 101
粉丝 7
获赞 15

您好,我是湘王,这是我的慕课手记,欢迎您来,欢迎您再来~


Java面试中有一类高频问题会经常问到火箭式问题Java有几种锁都是干嘛的我想对于面试经验较为丰富的人这个问题极有可能遇到过不过我估计除了死锁大部分人都听过以外其他的什么锁可能就不是那么清楚了实际上Java总共有6大类14种锁(不同的人对锁的理解不同可能分类和数量会不太一样这个无关紧要):

http://img2.mukewang.com/635bf2ca0001c55414840578.jpg

 


与锁相关的类继承结构

http://img1.mukewang.com/635bf2d30001216007230341.jpg



首先是悲观锁和乐观锁

1、悲观锁包括synchronized关键字和Lock类适合写操作多的场景

2、乐观锁包括CAS算法和原子类适合读操作多的场景

悲观锁与乐观锁的处理方式比较

http://img3.mukewang.com/635bf2da0001f74610800535.jpg

 


悲观锁与乐观锁的调用方式

http://img3.mukewang.com/635bf2e8000131e309500601.jpg



接着是自旋锁和适应性自旋锁

自旋锁,一种无需切换线程状态就能检查是否能持有资源的锁它的流程图是

http://img.mukewang.com/635bf3990001347609000610.jpg


所谓自旋锁其实就是我们经常在代码中看到的

for(;;) {

    ......

}

注意while...do底层调用的也是for(;;)

关于自旋锁有如下事实

1、如果锁被占用的时间很短,自旋锁的效果就会很好,反之很差

2、自旋等待的时间必须有限度,如果超过了限定次数就应该挂起

3、限定的默认自旋次数是10次,可以使用JVM参数-XX:PreBlockSpin来更改

4、可以使用JVM参数-XX:+UseSpinning来开启

 

最后剩下的一些锁了解就好了直到这些概念即可

1、无锁、偏向锁、轻量级锁重量级锁。

这四种锁是专门针对synchronized关键字的他们都与Java对象头和Monitor锁有关synchronized依赖于monitormonitor依赖于操作系统底层

无锁:资源共享,但只有一个线程能成功操作

偏向锁:一段同步代码一直被某个线程锁获得,JDK6之后默认启用,使用-XX:-UseBiasedLocking=false关闭

轻量级锁:偏向锁被另外的线程访问时,就会升级为轻量级锁

重量级锁:轻量级锁的升级

 

2、公平锁非公平锁。

公平锁:指的是按照申请锁的顺序,在等待队列中排队来获取锁

非公平锁:指的是直接尝试获取锁,获取不到才会到等待队列中排队意思就是插队做了核算

公平锁注重公平,但缺乏效率

 

3、可重入锁非可重入锁。

可重入锁:又叫递归锁,意思是同一个线程在外层方法获取到锁的时候,再进入到内层方法就会自动获取到锁(ReentrantLock和synchronized都是可重入锁)

非可重入锁:进入内层方法时,需要将外层锁释放,但由于线程已在方法中,无法释放,因此极有可能会造成死锁

http://img.mukewang.com/635bf3a70001ab9d06010269.jpg


 

4、独享锁共享锁

独享锁:也叫排他锁,只能被一个线程所持有,既能读又能写

共享锁:可被多个线程持有,但只能读不能写

独享锁和共享锁是互斥的通过ReentrantLock和ReentrantReadWriteLock实现

 

开发中最常见的其实就是悲观锁乐观锁和自旋锁尤其在Java源码中出现的很多),理解清楚这几个其他的都不难懂

 



 

感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~





打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP