首页IT科技java 多线程 例子(Java多线程(6):锁与AQS(上))

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

时间2025-06-14 04:40:38分类IT科技浏览5626
导读:您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~...

您好              ,我是湘王                     ,这是我的博客园       ,欢迎您来       ,欢迎您再来~

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

与锁相关的类继承结构:

首先                     ,是悲观锁和乐观锁       。

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

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

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

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

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

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

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

for(;;) {

......

}

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

关于自旋锁有如下事实:

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

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

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

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

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

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

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

无锁:资源共享                     ,但只有一个线程能成功操作; 偏向锁:一段同步代码一直被某个线程锁获得                     ,JDK6之后默认启用,使用-XX:-UseBiasedLocking=false关闭; 轻量级锁:偏向锁被另外的线程访问时              ,就会升级为轻量级锁; 重量级锁:轻量级锁的升级              。

2       、公平锁和非公平锁。

公平锁:指的是按照申请锁的顺序                     ,在等待队列中排队来获取锁; 非公平锁:指的是直接尝试获取锁       ,获取不到才会到等待队列中排队                     。意思就是插队做了核算                     。

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

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

可重入锁:又叫递归锁                     ,意思是同一个线程在外层方法获取到锁的时候       ,再进入到内层方法就会自动获取到锁(ReentrantLock和synchronized都是可重入锁); 非可重入锁:进入内层方法时       ,需要将外层锁释放                     ,但由于线程已在方法中              ,无法释放       ,因此极有可能会造成死锁                     。

4              、独享锁和共享锁

独享锁:也叫排他锁                     ,只能被一个线程所持有              ,既能读又能写       。 共享锁:可被多个线程持有,但只能读不能写              。

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

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

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

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
工程项目复验报告(工程复现 — grid map和elevation map) 成都中企动力技术服务有限公司(打造优秀城市分站的必备插件-WordPress城市分站插件)