关于Synchronized的各种锁

本秂侑毒 提交于 2020-03-04 16:50:25

执行流程如下:

1.当一个线程(假设叫A线程)想要获得锁时,首先检查对象头中的锁标志,如果是偏向锁,则跳转到2,如果是无锁状态,则跳转到


2.检查对象头中的偏向线程id是否指向A线程,是,则直接执行同步代码块,不是则3。


3.使用cas操作将替换对象头中的偏向线程id,成功,则直接执行同步代码块。失败则说明其他的线程(假设叫B线程)已经拥有偏向锁了,那么进行偏向锁的撤销(因为这里有竞争了),此时执行4。


4.B线程运行到全局安全点后,暂停该线程,检查它的状态,如果处于不活动或者已经退出同步代码块则原持有偏向锁的线程释放锁,然后A再次执行3。如果仍处于活动状态,则需要升级为轻量级锁,此时执行5。


5.在B线程的栈中分配锁记录,拷贝对象头中的MarkWord到锁记录中,然后将MarkWord改为指向B线程,同时将对象头中的锁标志信息改为轻量级锁的00,然后唤醒B线程,也就是从安全点处继续执行。


6.由于锁升级为轻量级锁, A线程也进行相同的操作,即,在A线程的栈中分配锁记录,拷贝对象头中的Mark Word到锁记录中,然后使用cas操作替换MarkWord,因为此时B线程拥有锁,因此, A线程自旋。如果自旋一定次数内成功获得锁,那么A线程获得轻量级锁,执行同步代码块。若自旋后仍未获得锁,A升级为重量级锁,将对象头中的锁标志信息改为重量级的10,同时阻塞,此时请看7。


7.B线程在释放锁的时候,使用cas将MarkWord中的信息替换,成功,则表示无竞争(这个时候还是轻量级锁, A线程可能正在自旋中)直接释放。失败(因为这个时候锁已经膨胀),那么释放之 后唤醒被挂起的线程(在这个例子中,也就是A)。
 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!