hey*_*smo 5 java multithreading locking monitor
假设我有2个线程,t1和t2,以及一个锁定对象,m.线程t1处于无限循环中,在每次迭代时,它会抓取m上的锁定,执行某些操作,解锁m并立即重新启动.在一次迭代期间,t2请求对m进行锁定但被t1阻止并且必须等待.现在,当t1解锁m时,是否保证t2将获得m的下一次锁定?或者可以点t1下一轮迭代偷偷走在前面?
通常,是否为等待线程设置了队列?如果t1具有锁定,并且所有其他线程也希望该锁定按以下顺序被阻止:t2,t3,...,其余线程将按照它们被阻止的顺序继续执行(例如t2运行,然后是t3,等等.)?
(我简单地仔细阅读了java规范并找不到答案.如果它在那里,请告诉我,我会回去仔细阅读.)
谢谢!(首先是SO帖子,哇哦!)
是的,有一个队列,这可能公平也可能不公平。公平队列成本更高,非公平队列更快(谁赢得了CAS就赢得了锁)。检查java.util.concurrent.locks.AbstractQueuedSynchronizer以获取更多信息。
剩余的线程是否会按照被阻止的顺序继续执行(例如,先运行 t2,然后运行 t3,等等)?
主要问题是它们是同时执行的,您无法真正定义同时执行的 2 个事件的顺序。但是,公平(由于额外成本,不推荐)锁定任何设法将自己登记为锁的线程最终将拥有它。