导览:
1,线程的安全问题
2,sync的介绍
3,markword的介绍
4, 锁升级
5,重量级的实现
1:为什么会产生线程安全问题
多个线程对同一共享资源就行操作的时候,会产生线程安全问题。
常见的线程安全是由硬件,线程,编译器优化等造成
总结可分为原子性,可见性,有序性。
2,sync的介绍
我们都知道使用sync可以解决上述问题,先来介绍一下sync的使用。
sync是jvm层面实现的关键字,可以加在实例方法上,也可以加在静态方法上,以及使用在同步代码上。
加在同步代码块上,它的范围是当前实例,加在静态方法上,表示锁的整个类。
如果使用在同步代码块上,取决于同步代码块上的内容是什么。
我们都知道,锁是互斥,排他的,在同一时刻,只有一个线程能获取到该资源。
要实现这个互斥,排他的特性,我们可以对共享资源进行标记,抢占模型:
抢占模型.jpg
3,共享标记存储在哪,存储在我们对象头里面,先来看一下对象的内存布局以及对象头的结构
对象内存布局1.jpg
对象头1.png
4,锁升级:
当只有一个线程的时候,默认是偏向锁,并记录偏向锁标记为1,而且记录线程id,当其他线程来竞争的时候,升级为轻量级锁,然后还没抢到的时候,会再次升级为重量级锁。
锁升级.jpg
5,重量级的实现:
是由ObjectMonitor实现
ObjectMonitor.jpg