假设我有三个线程,线程1,线程2和线程3都共享相同的锁。线程2获取锁,做一些工作,然后通过调用await方法阻塞。线程1然后获取锁,做一些工作,并且在其中间,线程3尝试获取锁但是由于线程1持有它而被阻止。线程1完成工作,并在终止之前,向线程2发出信号,表明它可以重新获取锁定。那会发生什么呢?线程2或线程3会获得下一个锁吗?
非常感谢您的时间和提前帮助。
答案 0 :(得分:2)
如果没有给出优先权,那么谁先获得锁定。
虽然mutual exclusion
可能提供safety
属性,但它不能确保liveness
属性。有些情况下线程会首先获取锁定,导致starvation
(其他线程永远等待,因为有人一直占据)。
Google会突出显示关键字,这有助于您了解更多信息。我发现这些幻灯片非常全面http://www.cs.cornell.edu/Courses/cs414/2004su/slides/05_schedule.pdf
答案 1 :(得分:0)
如果您正在使用ReentrantLock(或其任何子类),则可以将“fairness”标志传递给构造函数。如果设置为true,这将确保锁的控制权传递给等待时间最长的线程,在本例中为Thread 1。
Lock lock = new ReentrantLock(true);