面试宝典——Java 锁

  • Java对象头:包含 Mark Word(标记字段)、Klass Pointer(类型指针),数组长度只有在对象是数组是才有用,其他时候没有这个字段。有压缩模式和非压缩模式两种,压缩模式下指针只占4个字节,一共占12个字节,非压缩模式下16个字节。

  • 实际数据

  • 对象填充

Java对象头

Java对象头Mark Word的组成部分:

image.png

Java对象有4中锁的状态、无锁、偏向锁、轻量级锁、重量级锁

无锁:锁标记位为01,偏向标记为0

偏向锁:锁标记位为01,偏向标记为1,偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程是不会主动释放偏向锁的。优点:偏向锁的加锁和解锁更容易,而且更快,接近于纳秒级别,缺点:一旦产生竞争,锁膨胀过程中会对锁进行撤销,带来一定的损耗。

轻量级锁:锁标记位为00,偏向锁一旦产生竞争,会通过CAS自旋加锁,如果加锁成功,则会升级为轻量级锁,同时不短的通过自旋的方式,抢占锁。优点:通过自旋的方式加锁,不会阻塞;缺点:自旋会带来CPU的损耗,同时容易进入长时间的自旋;适应场景:同步代码块短小,且执行快,适合使用自旋的方式加锁。

重量级锁:锁标记为10,在自旋加锁过程中,如果自旋次数超过10次无法加锁成功,则会膨胀为重量级锁,重量级锁会依赖于操作系统的系统调用,需要像内核申请资源,需要进行内核态和用户态的转换,因此会消耗很多的CPU资源。优点:不需要自旋,缺点:线程是阻塞的, 适用场景:高吞吐量(等待过程中,线程的调度是由操作系统完成挂起和唤醒,无需CPU自旋等待,CPU可以去做其他事情,整体的吞吐量会比其他锁高一些),或者执行时间长的同步代码块。

4、公平锁和非公平锁


公平锁和非公平锁一般是在ReentrantLock里面才会用到,synchronized是非公平锁,获取锁时,所有的线程会有竞争,而且是随机唤醒一个,参考notify和notifyAll,只有一个线程能获得锁,但并一定是先来的那一个。

ReentrantLock里面,实现公平锁和非公平锁的方式,是在获取锁的时候,需要判断当前线程是不是等待队列的第一个线程。可以参考源码

5、可重入锁和非可重入锁


可重入锁:在同一个对象里面,同一把锁,且已经获取了锁的前提下,同一个线程,如果执行其他的需要获取这把锁的方法或者同步代码段,无需排队等待,直接可以拿到锁。

非可重入锁:必须每次都得等待获取锁,非可重入锁,容易引发死锁,举例说明:Class A 里面有两个加锁的方法,方法1 和 方法2

class A {

public synchronized void fun1(){

fun2();

}

public synchronized void fun2(){

doSomething();

}

}

复制代码

线程1获取到A的锁之后,如果是非可重入锁,在执行fun2时,需要继续等待获取锁,但是这个时候,如果拿不到,那么fun1就无法释放锁,所以会有可能引发死锁。

可重入锁的实现,就是每次加锁的时候,会比较线程ID跟当前持有锁的线程是不是相同,如果相同,则不用获取锁。

ReentrantLock里面,如果是重入锁,会对state进行加1。

image.png

6、共享锁和排他锁


ReentrantReadWriteLock 读写锁。

写锁:可重入的排他锁。

读锁:可重入的共享锁。

锁降级:写锁可以降级为读锁。这块不是太了解,感觉很难理解,而且不知道在什么场景下使用,有知道的大佬可以指点一下。

7、synchronized和ReentrantLock的相同点和区别


  • ReentrantLock是一种可中断锁,如果等待时间较长,等待中的线程可以放弃锁去执行其他的事情

  • ReentrantLock和synchronized都是非公平锁,但是reentrantlock可以通过构造方法,设置为公平锁。

  • ReentrantLock可以有设置多个条件。synchronized 一个锁会维护一个等待队列,reentrantlock的条件等待则会每个条件都维护一个队列,这样的话,就可以实现按照条件唤醒。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)

image

image

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
存中…(img-FrKR9fEo-1712534330929)]

[外链图片转存中…(img-XBOfCT8F-1712534330930)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值