公司动态
synchronized 锁释放时的“竞争“
一、先说结论:这里的"竞争"是指多个线程同时试图获取同一把锁,但锁只有一个,最终只有一个能成功,其他失败者必须等待或重试。你可以把锁想象成一个只能容纳1个人的卫生间,线程就是想上厕所的人。竞争:多个人同时冲向卫生间,去拉门把手(尝试获取锁)。抢到锁:拉开门进去了(成功获取锁,执行临界区)。没抢到:门被锁着,只能排队等待(阻塞或自旋)。二、竞争在JVM层面到底发生了什么?锁的内部结构(重量级锁)HotSpot中,每个对象头(Mark Word)膨胀为重量级锁后,会指向一个ObjectMonitor结构。这个结构里有几个关键队列:┌─────────────────────────────────────────────────────┐ │ ObjectMonitor │ ├─────────────────────────────────────────────────────┤ │ _owner → 当前持有锁的线程 │ │ _EntryList → 等待获取锁的线程队列(竞争池) │ │ _WaitSet → 调用了 wait() 的线程队列 │ │ _cxq → 新来的竞争线程栈(Contention List)│ └─────────────────────────────────────────────────────┘