synchronized
一、synchronized的基础
Java中的每个对象都有内部锁,都可以作为一个锁;
- 普通同步方法,锁是当前实例对象
- 静态同步方法,锁是当前类的class对象
- 同步方法块,锁是Synchronized括号中配置的对象
二、实现原理
JVM基于进入和退出Monitor对象来实现方法同步和代码块同步;
这个Monitor翻译为监视器,但是可以理解为一个每次只允许一个人进入的房间;每一个对象都有它对应的monitor,这个monitor被人持有了它将进入锁定状态。
但是两者的实现细节不一样:
1.代码块同步
使用monitorenter和monitorexit指令实现。
2.方法同步
JVM规范中没有详细说明,但是仍可以用monitorenter和monitorexit指令实现。
3.指令细节
monitorenter指令会插到同步代码块的开始的位置,相对应的monitorexit就是插入到结束的地方。
JVM保证一个monitorenter就要对应monitorexit(这里就等同于操作系统中的MuteX,互斥使用资源的方式)
- 线程执行monitorenter指令,就会尝试获得monitor的所有权;
- 线程执行monitorexit指令,就会释放monitor的所有权