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

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。

6、共享锁和排他锁
ReentrantReadWriteLock 读写锁。
写锁:可重入的排他锁。
读锁:可重入的共享锁。
锁降级:写锁可以降级为读锁。这块不是太了解,感觉很难理解,而且不知道在什么场景下使用,有知道的大佬可以指点一下。
7、synchronized和ReentrantLock的相同点和区别
-
ReentrantLock是一种可中断锁,如果等待时间较长,等待中的线程可以放弃锁去执行其他的事情
-
ReentrantLock和synchronized都是非公平锁,但是reentrantlock可以通过构造方法,设置为公平锁。
-
ReentrantLock可以有设置多个条件。synchronized 一个锁会维护一个等待队列,reentrantlock的条件等待则会每个条件都维护一个队列,这样的话,就可以实现按照条件唤醒。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。


既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)


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

被折叠的 条评论
为什么被折叠?



