目录
1.Synchronized关键字的底层实现是什么?
从各个层面分析
1.java代码: synchronized
2.字节码的层面: monitorenter,moniterexit
3.jvm 执行过程中会自动升级 无锁--》偏向锁---》轻量级锁---》重量级锁
4.lock comxchg
2.什么是Synchronized的锁升级?
1.6之前,synchronized是一个重量级锁,1.6之后,jvm对synchronized进行了锁升级,出现了锁的状态从无锁-->偏向锁-->轻量级锁--->重量级锁这个过程。
3.什么是偏向锁,轻量级锁,重量级锁呢?
偏向锁是第一次执行synchronized的代码,会把锁的线程id放在mark word里,下一次如果是同一个线程进来,只需要先判断,mark word中的线程id是不是当前的线程id,如果是当前的线程id,直接执行代码块中的代码。
轻量级锁:当前锁状态是偏向锁,被另外的线程访问,此时偏向锁就会升级为轻量级锁,其他线程会以自旋的方式获得锁,不会阻塞。mark word存储胡中指向栈中锁记录的指针。
重量级锁:如果锁的竞争激烈,达到最大自旋次数的线程,会将轻量级锁升级为重量级锁,等待的锁会直接挂起。markword中指向互斥量的指针。
4.各种锁之间的区别和联系?
偏向锁: Mark Word 里存储锁偏向的线程 ID 标志位 01
轻量级锁:指向栈中锁记录的指针 00 锁竞争失败会自旋
重量级锁:指向互斥量的指针 11 锁竞争失败会阻塞
一图胜千言
参考
1.https://www.jianshu.com/p/eac466494477-----------cas 原理
2.https://www.jianshu.com/p/da9d051dcc3d----aqs
3.https://blog.csdn.net/u012102536/article/details/103070769--- aqs源码分析
4.https://www.cnblogs.com/jxxblogs/p/11751944.html-------线程池的状态
5.https://www.jianshu.com/p/389b58856894----- java 线程池源码分析
6.https://www.jianshu.com/p/117571856b28---- java 线程池的实现源码分析
7.https://www.jianshu.com/p/063ebba64ec4---- java 线程池原理与Executor框架
8.https://www.jianshu.com/p/36eedeb3f912-----偏向锁,轻量级锁,重量级锁详解
9.https://www.bilibili.com/video/BV1s741127Gn?from=search&seid=14128259413075469454 ------ 偏向锁,轻量级锁,重量级锁视频
10.https://blog.csdn.net/lengxiao1993/article/details/81568130---- 偏向锁,轻量级锁,重量级锁的详解
11.https://segmentfault.com/a/1190000022904663