Java锁和条件

时间:2014-04-23 02:13:52

标签: java multithreading locking

假设我有三个线程,线程1,线程2和线程3都共享相同的锁。线程2获取锁,做一些工作,然后通过调用await方法阻塞。线程1然后获取锁,做一些工作,并且在其中间,线程3尝试获取锁但是由于线程1持有它而被阻止。线程1完成工作,并在终止之前,向线程2发出信号,表明它可以重新获取锁定。那会发生什么呢?线程2或线程3会获得下一个锁吗?

非常感谢您的时间和提前帮助。

2 个答案:

答案 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);