JVM底层是如何实现synchronized的

java中存在两种锁机制:synchronized和lock;
锁同步依赖方式:synchronized在软件层面依赖JVM,lock在硬件层面依赖特殊的cpu指令;
ConnectionList是个虚拟队列,后进先出;
只有Owner线程能从ConnectionList队尾取元素( 那为啥叫做后进先出队尾,什么时候出,谁让出?);
Ower线程会在unlock时会从ConnectionList中迁移线程到EntryList,并会指定EntryList中的某一个线程(一般为Head)为Ready(OnDeck)线程;
自旋原理:线程争用锁时,若没有竞争上锁,可以先等一等,自旋一定时间,不着急进入阻塞状态。自旋一定时间后,若Owner线程还是占用所,则进入阻塞状态。这样对短时间运行的代码很有效果,不会频繁进入阻塞状态。 在多处理器上才有意义?
cas:compare-and-swap,是一条cpu指令,其作用是让cpu比较后原子的更新某个位置的值;
偏向锁:一旦线程第一次获得了监视对象,之后让这个监视对象偏向于这个线程:之后的多次调用可以避免cas流程,说白了就是置个变量,如果发现为true则无需再走各种加锁/解锁流程;

总结:通过上面的介绍可以看出, synchronized的底层实现主要依靠Lock -Free的队列,基本的思路是自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量。

Lock:AbstractQueuedSynchronizer会把所有请求线程构成一个CLH队列,当一个线程执行完毕后,会激活自己的后续节点。但是正在执行的线程不在队列中,而那些等在执行的线程全部处于阻塞状态。与synchronized相同,这也是一个虚拟队列。




猜你喜欢

转载自bsniao.iteye.com/blog/1943373