当两个线程试图获取同一个对象的锁时,那些被认为决定锁应该移交给哪个线程的东西是什么。
答案 0 :(得分:4)
根据Java documentation for notify():
唤醒正在此对象监视器上等待的单个线程。如果 任何线程都在等待这个对象,其中一个被选中 惊醒。 选择是任意的,由酌情决定 实现。线程通过调用一个线程在对象的监视器上等待 等待方法。
因此,如果您使用synchronized(obj){}
,您基本上无法控制哪个线程将获得obj
上的锁定,您无法做出任何假设。这取决于调度程序。
如果你想要公平(也就是说,获得锁定的下一个线程是队列中的第一个),请查看ReentrantLock:它有一个布尔标志来指定你想要强制公平。
答案 1 :(得分:0)
此类的构造函数接受可选的fairness参数。当设置为true时,在争用下,锁定有利于授予对等待时间最长的线程的访问权限。否则,此锁定不保证任何特定的访问顺序。
如果你允许公平,那么使用FIFO(先入先出),否则它似乎是随机的(根据我的观察)。