参考视频:https://space.bilibili.com/1578320?spm_id_from=333.788.b_765f7570696e666f.2
up主: 寒食君 ,这是一个很有意思的up主, 大家可以去点赞关注他.
什么是锁?
在并发环境下,多个线程会对同一个资源进行争抢. 那么可能就会造成数据不一致的情况.为了解决这个问题,很多语言引入了锁机制.
锁是一种抽象的概念.. 那么在代码层面,锁究竟是如何实现的?
在java中,每个Object对象都有一把锁. 这把锁存放在对象头中.锁中记录了当前对象被哪个线程占用.
java对象包含三个部分,如下
对象头,实例数据,填充字节
对象头又分为 : Mark word 和 Class Point.
Class Point是一个指针. 它指向了当前对象类型所在方法区中的类型数据.
Mark word存储了很多和当前对象运行时状态有关的数据. 如下
线程和轻量级锁的绑定
Synchronized在Java中可以用来同步线程. Synchronized被编译后会生成monitorenter和monitorexit两个字节码指令.
当一个对象被一个线程占用,其他想获取这个对象的线程就会发生自旋.
monit依赖于操作系统的mutex lock实现的.
java线程实际上是对操作系统线程的映射.
从jdk6,锁分为了 无锁,偏向锁,轻量级锁,重量级锁. 锁只能升级.