-
Java对象的对象头里面的MarkWork指向Monitor(Java环境看不到,属于操作系统),每个对象关联一个Monitor。
-
线程2获取到了对象锁,那么线程2就是该Monitor的Owner。
-
当线程2没有释放锁,线程1获取对象锁时,线程1就会进入到EntryList阻塞队列里面,同时线程1的状态变为BLOCKED阻塞状态。
-
当锁释放了之后,其它在EntryList队列里面的线程就会竞争。
-
当线程获取了锁,但是需要达成某些条件才能继续执行,那么可以调用对象的wait()方法,此时线程进入WaitSet队列等待,等对象调用了notify()或者notifyAll()方法,线程被唤醒之后,线程再次进入EntryList队列竞争,因此WaitSet队列里面的线程被唤醒之后不是立刻执行。
-
synchronized必须进入同一个对象的Monitor才会有上述效果。
-
不加synchronized也没有上述效果。