是什么决定了两个竞争线程中的哪一个获得锁定?

its*_*aja 5 java concurrency

当两个线程试图获取同一个对象的锁时,那些被认为决定锁定应该被移交给哪个线程的东西是什么.

Sav*_*era 4

根据notify()的Java文档

唤醒正在该对象的监视器上等待的单个线程。如果有任何线程正在等待该对象,则选择唤醒其中一个线程。该选择是任意的并且由实现自行决定。线程通过调用 wait 方法之一来等待对象的监视器。

因此,如果您使用,synchronized(obj){}您基本上无法控制哪个线程将获得 上的锁obj,并且您无法做出任何假设。这取决于调度程序。

如果您想要公平性(即,下一个获取锁的线程是队列中的第一个线程),请查看ReentrantLock:它有一个布尔标志来指定您想要强制公平性。