Java并发编程 | Synchronized原理与使用( 二 )


在HotSpot虚拟机中,抛开锁升级、自适应等机制;基本原理是线程通过 CAS抢占对象监视器( Monitor ) _Owner来实现锁,没有抢占的会进入 _EntryList 来进行放置 。当然,线程执行/中断释放_Owner后,_EntryList并不是简单按照FIFO来进行选择执行不会保证公平性,所以Synchronized是非公平锁 。

Java并发编程 | Synchronized原理与使用

文章插图
图中_WaitSet没有体现用途,但其是很重要的一个结构,用于当 _Owner 执行线程中断时,线程将会写入 。值得注意获取到锁之后才能中断,等待锁时不可中断 。当相关线程被唤醒后,会采有不同的策略重新回到_EntryList 或者 参与CAS竞争 _Owner,这里存在线程上下文切换的可能 。
详细可以查看相关源码:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/69087d08d473/src
在最后综述下Synchronized 特性:悲观锁、可重入锁、非公平锁 。欢迎长期关注公众号/头条号(Java研究者)

经验总结扩展阅读