JAVA系列教程--Object Monitor与Synchronized关键字

java Object Monitor机制

每个java对象都是一个monitor object,通过该monitor object, 可以实现线程之间的阻塞和唤醒

JAVA系列教程--Object Monitor与Synchronized关键字

具体转换过程:

  1. 当线程需要获取Object Monitor的锁时,进入Entry Set

  2. 如果线程获取锁成功,则进入The Owner状态,每个Object的Ower同一时刻只能有一个线程进入

  3. 如果The Owner调用了wait()或者wait(timeout)方法,则当前线程释放Owner并进入Wait Set

  4. 当某个线程在进入Owner之后调用了Notify()或notifyAll()方法,则一个或多个Wait Set中的线程被唤醒,重新进入Entry Set去争取The Owner

5.如果The Owner对于锁代码段执行完毕,则释放The Owner

注意:Object.wait()方法和notify()方法前提是该线程获取到了The Owner

synchronized实现原理

  1. synchronized的三种用法
    a. synchronized某个实例方法
    ​​JAVA系列教程--Object Monitor与Synchronized关键字
    b. synchronized某个静态方法
    JAVA系列教程--Object Monitor与Synchronized关键字
    c. synchronized方法块
    JAVA系列教程--Object Monitor与Synchronized关键字

  2. synchronized实现与Object Monitor关系
    当我们调用synchronized实例方法,静态方法和同步块时,内部实现其实是先去获取相关object的Monitor,即获取该对象的The Owner, 如果获取The Owner成功,则执行相关的方法或同步块,一旦方法或同步代码块执行完成则释放The Owner(如果同步方法或代码块执行过程中抛出异常,则同样也会释放The Owner)

  3. 三种同步实现所使用的Monitor对象

同步方法 Monitor对象
实例方法同步 主要是获取当前运行对象的Monitor
静态方法同步 主要是获取类对象的Monitor
同步代码块同步 主要获取同步块中对象的Monitor
  1. Object Monitor机制的可重入
    举个例子,如下面代码的,当我们的实例化同步方法addMoney()需要去调用实例化同步方法getMoney()时,我们能调用成功,这就是说当我们获取到了当前对象Montor的The Owner时,我们需要重新再次获取他的时候,能直接获取成功,同时对于Monitor的释放,也是每次释放自己本次获取的Monitor对象,所以上面的例子我们获取了两次Monitor的The Owner,同时也需要释放两次,第一次是完成getMoney的调用,另一次是完成addMoney()的调用
    JAVA系列教程--Object Monitor与Synchronized关键字
上一篇:ORACLE中如何找出大表分布在哪些数据文件中?


下一篇:Oracle索引的维护