synchronized底层使用JVM级别中的Monitor来决定当前线程是否获得了锁,如果一个线程活了锁,在没有释放锁之前,其他线程是不能获得锁的。synchronized属于悲观锁。
monitor对象存在于Java每个对象的对象头中,synchronized锁便是通过这种方式获取锁的,也是Java中任意对象可以作为锁的原因。
monitor内部维护了三个变量,
WaitSet:保存处于Waiting状态的线程
EntrySet:保存处于Blocked状态的线程
Owner:持有锁的线程】
一个线程获取锁的标志就是在monitor中成功设置了Owner,一个monitor中只能有一个owner。在上锁的过程中,如果有其他线程也来抢锁,则进入EntryList进行阻塞,当获得锁的线程执行完了,释放了锁,就会唤醒EntryList中等待的线程竞争锁,竞争的时候是非公平的。