跳到主要内容

为什么说 Synchronized 是非公平锁?

参考答案:

Synchronized(同步块或同步方法)在Java中默认是非公平锁。这意味着当多个线程尝试获取同一个锁时,Synchronized不会按照请求锁的顺序分配锁,而是允许任何等待线程随机获取锁。这种锁的分配方式被称为非公平锁,因为它不考虑线程请求锁的顺序,而只是允许抢占。

具体来说,当锁被释放后,任何一个线程都有机会竞争得到锁,这样做的目的是提高效率。然而,这种非公平性的分配方式可能导致某些线程被长时间地阻塞,而其他线程不断抢占锁。这可能导致某些线程的等待时间变得不确定,不利于某些场景中对线程执行时间的可控性和公平性要求。

此外,当线程进入ContentionList时,等待的线程会先尝试自旋获取锁,如果获取不到就进入ContentionList。这明显对于已经进入队列的线程是不公平的。还有一个不公平的事情就是自旋获取锁的线程还可能直接抢占OnDeck线程的锁资源。

尽管非公平锁在某些情况下可以提高效率,但由于其可能导致线程饥饿和其他线程相关问题,因此在设计并发系统时需要谨慎考虑其使用。