我自己记得笔记,网易面试也考了这道题
Synchronized的底层实现依赖于JVM, HotSpot JVM实现中,锁有个专门的名字:对象监视器。

当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程:

Contention List:一个虚拟的队列,所有请求锁的线程将被首先放置到该竞争队列

Entry List:Contention List中那些有资格成为***的线程被移到Entry List,ContentionList 会被线程并发访问,为了降低对ContentionList队尾的争用

Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set

OnDeck:任何时刻最多只能有一个线程正在竞争锁,该线程称为OnDeck

Owner:获得锁的线程称为Owner

!Owner:释放锁的线程

 

具体实现方式是:新请求锁的线程将首先被加入到ConetentionList中,当某个拥有锁的线程(Owner状态)调用unlock之后,如果发现EntryList为空则从ContentionList中移动线程到EntryList,OnDeck线程获得锁后即变为owner线程,无法获得锁则会依然留在EntryList中