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

时间:2012-02-11 15:00:11

标签: java concurrency

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

2 个答案:

答案 0 :(得分:4)

根据Java documentation for notify()

  

唤醒正在此对象监视器上等待的单个线程。如果   任何线程都在等待这个对象,其中一个被选中   惊醒。 选择是任意的,由酌情决定   实现。线程通过调用一个线程在对象的监视器上等待   等待方法。

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

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

答案 1 :(得分:0)

根据Java Oracle Docs

  

此类的构造函数接受可选的fairness参数。当设置为true时,在争用下,锁定有利于授予对等待时间最长的线程的访问权限。否则,此锁定不保证任何特定的访问顺序。

如果你允许公平,那么使用FIFO(先入先出),否则它似乎是随机的(根据我的观察)。