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

文章插图
图中_WaitSet没有体现用途,但其是很重要的一个结构,用于当 _Owner 执行线程中断时,线程将会写入 。值得注意获取到锁之后才能中断,等待锁时不可中断 。当相关线程被唤醒后,会采有不同的策略重新回到_EntryList 或者 参与CAS竞争 _Owner,这里存在线程上下文切换的可能 。
详细可以查看相关源码:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/69087d08d473/src
在最后综述下Synchronized 特性:悲观锁、可重入锁、非公平锁 。欢迎长期关注公众号/头条号(Java研究者)
经验总结扩展阅读
- javascript编程单线程之同步模式
- java程序员在交接别人的工作时如何保证顺利交接?
- python渗透测试入门——基础的网络编程工具
- 都卷Java,你看看你得学多少技术栈才能工作!
- 【高并发】深度解析ScheduledThreadPoolExecutor类的源代码
- JavaScript函数式编程之函子
- 学习ASP.NET Core Blazor编程系列八——数据校验
- Java实现7种常见密码算法
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
- 不妨试试更快更小更灵活Java开发框架Solon
