不管是在校招还是社招中的面试,常会被问到volatile与synchronized的区别,在volatile关键字剖析文章中已经介绍了相关的原理,在本篇中将剖析synchronized关键字原理
众所周知 synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式:
- 同步普通方法,锁的是当前对象
- 同步静态方法,锁的是当前 Class 对象
- 同步块,锁的是 () 中的对象
实现原理:
- JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的
- 具体实现是在编译之后在同步方法调用前加入一个 monitor.enter 指令
在退出方法和异常处插入 monitor.exit 的指令 - 其本质就是对一个对象监视器( Monitor )进行获取,而这个获取过程具有排他性从而达到了同一时刻只能一个线程访问的目的
- 而对于没有获取到锁的线程将会阻塞到方法入口处,直到获取锁的线程 monitor.exit 之后才能尝试继续获取锁
流程如下图所示: