重量级锁
计算机操作系统本有
Monitor对象,称为管程。在java里面看不到此对象。每个
Java对象都可以关联一个monitor对象,如果使用了synchronized给对象上重量级锁后,该对象的Mark word就被设置指向Monitor对象的指针。
Monitor
Monitor翻译为监视器或者管程,Monitor对象其实就是使用管程控制同步访问的一种对象。我们刚才讲的锁synchronized锁使用的就是对象头的Mark Word字段中的一部分。Mark Word中的某些字段发生变化,就可以代表锁不同的状态。由于锁的信息是记录在对象里的,有的开发者也往往会说锁对象。
Monitor对象内存结构
WaitSet:是线程等待队列。状态为WAITINGEntryList:线程阻塞队列。状态为BLOCKEDOwner:正在执行的线程(可能很多线程竞争一个资源,但只有一个线程能够成功,此时Owner就置为此线程)
工作原理:
-
新建的对象,此时
Mark Word关联一个Monitor对象(即Mark Word记录一个Monitor对象的地址)。此时因为还没有线程去获得Monitor锁,所以Monitor对象里面的Owner为Null。 -
多个线程竞争,只有线程1成功。其他进入阻塞队列。(或者说只要
Owner非空,那么其他线程就要进入阻塞队列)当线程1执行完毕后,通知阻塞队列里的线程,引起它们的非公平性竞争。
- 若此时
Owner线程调用wait方法,那么会进入WaitSet。当被唤醒时(如调用notify()或者notifyAll())会进入EntryList重新竞争。