发布时间:2022-10-29 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

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

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

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

与锁相关的类继承结构:

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

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

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

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

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

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

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

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

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

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

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

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

for(;;) {

......

}

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

关于自旋锁有如下事实:

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

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

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

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

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

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

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

2、公平锁和非公平锁。

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

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

4、独享锁和共享锁

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

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

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