深入浅出Synchronized

导览:
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

你可能感兴趣的:(深入浅出Synchronized)