- 修饰普通方法,锁当前实例对象
- 修饰静态同步方法,锁当前类对象
- 修饰同步代码块,锁括号中配置对对象
- synchronized 属于jvm锁,虚拟机会自动释放该锁。
synchronized 的实现原理
JVM基于进入和退出 monitor 对象来实现方法同步和代码块同步,其中进出 monitor 对象使用 monitorenter 指定和 monitorexit 指令实现。
monitorenter 是在编译后插入到同步代码块的位置,monitorexit 是在编译后插入到同步代码块结束或者异常发生的位置。每一个 monitorenter 都会与一个 monitorexit 对应,当一个 monitor 对象被持有后,他便处于锁定状态,不能再被其他线程持有。
synchronized 可以保证操作的原子性和可见性
原子性:synchronized 代码块中的语句要么全部执行要么全不执行。
可见性:当线程离开同步代码块的时候会将线程本地内存同步回主内存。
synchronized 属于重量级锁
网友评论