synchronized原理
synchronized本质上是通过JVM的内部对象 Monitor(监视器) 实现的, 基于进入与退出Monitor对象实现同步,而监控器锁的实现又依赖操作系统底层的Mutex lock(互斥锁)实现。
任何一个对象都会有一个monitor对象与其关联,当且一个Monitor被持有后,它将处于锁定状态。
synchronized关键字编译成字节码后,会被翻译成monitorenter 和 monitorexit出现在同步代码块的开始和结尾处。
monitorenter :每个对象都是一个monitor锁,线程尝试获取锁时的过程如下:
a: 如果monitor的进入数为·0,那么线程会直接获取到锁,并设置1
b: 如果monitor已经被该线程占领,那么进入数会+1
c:如果其他线程占领了,那么该线程会被阻塞。一直到获取该锁为止
monitorexit: 线程退出同步代码块,会执行monitorexit,该线程必须是monitor的所有者。执行完后会将进入数-1,如果减完为
0,那么就会释放锁。
Monitor对象锁是java天生自带的,是一种同步工具,也是一个对象,所有的java对象都有成为Monitor的潜质,因为