Java锁和条件

Java锁和条件,java,multithreading,locking,Java,Multithreading,Locking,假设我有三个线程,线程1、线程2和线程3都共享同一个锁。线程2获取锁,进行一些工作,然后通过调用wait方法进行阻塞。然后线程1获取锁,进行一些工作,在锁的中间,线程3尝试获取锁,但由于线程1持有锁,因此被阻止。线程1完成工作,在终止之前,向线程2发出信号,表示它可以重新获得锁。那么接下来会发生什么呢?线程2或线程3接下来会获得锁吗 非常感谢您的时间和帮助。如果没有优先权,谁先来谁就获得锁 虽然互斥可以提供安全性属性,但它不能确保活性属性。在某些情况下,一个线程总是第一个获取锁,导致饥饿(其他线

假设我有三个线程,线程1、线程2和线程3都共享同一个锁。线程2获取锁,进行一些工作,然后通过调用wait方法进行阻塞。然后线程1获取锁,进行一些工作,在锁的中间,线程3尝试获取锁,但由于线程1持有锁,因此被阻止。线程1完成工作,在终止之前,向线程2发出信号,表示它可以重新获得锁。那么接下来会发生什么呢?线程2或线程3接下来会获得锁吗


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

如果没有优先权,谁先来谁就获得锁

虽然
互斥
可以提供
安全性
属性,但它不能确保
活性
属性。在某些情况下,一个线程总是第一个获取锁,导致
饥饿
(其他线程永远等待,因为有人一直占用)


突出显示关键词的谷歌将帮助您了解更多信息。我发现这些幻灯片非常全面

如果您使用的是ReentrantLock(或其任何子类),则可以向构造函数传递“公平性”标志。如果设置为true,这将确保锁的控制传递给等待时间最长的线程,在本例中是线程1

Lock lock = new ReentrantLock(true);
另外,当调用
nofity()
notifyAll()
时,没有规定指定哪个等待线程将获得锁。因此,在您的示例中,线程2或线程3可以获得下一个锁。