synchronized原理--重量级锁

100 阅读1分钟

image.png

重量级锁

计算机操作系统本有Monitor对象,称为管程。在java里面看不到此对象。

每个Java对象都可以关联一个monitor对象,如果使用了synchronized给对象上重量级锁后,该对象的Mark word就被设置指向Monitor对象的指针。

Monitor

Monitor翻译为监视器或者管程,Monitor对象其实就是使用管程控制同步访问的一种对象。我们刚才讲的锁 synchronized 锁使用的就是对象头的Mark Word字段中的一部分。Mark Word中的某些字段发生变化,就可以代表锁不同的状态。由于锁的信息是记录在对象里的,有的开发者也往往会说锁对象。

Monitor对象内存结构

image.png

  • WaitSet:是线程等待队列。状态为WAITING
  • EntryList:线程阻塞队列。状态为BLOCKED
  • Owner:正在执行的线程(可能很多线程竞争一个资源,但只有一个线程能够成功,此时Owner就置为此线程)

工作原理:

  1. 新建的对象,此时Mark Word关联一个Monitor对象(即Mark Word记录一个Monitor对象的地址)。此时因为还没有线程去获得Monitor锁,所以Monitor对象里面的OwnerNullimage.png

  2. 多个线程竞争,只有线程1成功。其他进入阻塞队列。(或者说只要Owner非空,那么其他线程就要进入阻塞队列)当线程1执行完毕后,通知阻塞队列里的线程,引起它们的非公平性竞争。

image.png

  1. 若此时Owner线程调用wait方法,那么会进入WaitSet。当被唤醒时(如调用notify()或者notifyAll())会进入EntryList重新竞争。