繁体   English   中英

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

[英]What determines which of two competing threads acquires a lock?

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

根据notify()Java文档

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

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

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

根据Java Oracle Docs

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM