java Object Monitor机制
每个java对象都是一个monitor object,通过该monitor object, 可以实现线程之间的阻塞和唤醒
具体转换过程:
-
当线程需要获取Object Monitor的锁时,进入Entry Set
-
如果线程获取锁成功,则进入The Owner状态,每个Object的Ower同一时刻只能有一个线程进入
-
如果The Owner调用了wait()或者wait(timeout)方法,则当前线程释放Owner并进入Wait Set
-
当某个线程在进入Owner之后调用了Notify()或notifyAll()方法,则一个或多个Wait Set中的线程被唤醒,重新进入Entry Set去争取The Owner
5.如果The Owner对于锁代码段执行完毕,则释放The Owner
注意:Object.wait()方法和notify()方法前提是该线程获取到了The Owner
synchronized实现原理
-
synchronized的三种用法
a. synchronized某个实例方法
b. synchronized某个静态方法
c. synchronized方法块 -
synchronized实现与Object Monitor关系
当我们调用synchronized实例方法,静态方法和同步块时,内部实现其实是先去获取相关object的Monitor,即获取该对象的The Owner, 如果获取The Owner成功,则执行相关的方法或同步块,一旦方法或同步代码块执行完成则释放The Owner(如果同步方法或代码块执行过程中抛出异常,则同样也会释放The Owner) -
三种同步实现所使用的Monitor对象
同步方法 | Monitor对象 |
---|---|
实例方法同步 | 主要是获取当前运行对象的Monitor |
静态方法同步 | 主要是获取类对象的Monitor |
同步代码块同步 | 主要获取同步块中对象的Monitor |
- Object Monitor机制的可重入
举个例子,如下面代码的,当我们的实例化同步方法addMoney()需要去调用实例化同步方法getMoney()时,我们能调用成功,这就是说当我们获取到了当前对象Montor的The Owner时,我们需要重新再次获取他的时候,能直接获取成功,同时对于Monitor的释放,也是每次释放自己本次获取的Monitor对象,所以上面的例子我们获取了两次Monitor的The Owner,同时也需要释放两次,第一次是完成getMoney的调用,另一次是完成addMoney()的调用