1
votes

Say I have three threads, thread 1, thread 2, and thread 3 all sharing the same lock. Thread 2 acquires the lock, does some work and then blocks via a call to the await method. Thread 1 then acquires the lock, does some work, and during the middle of it, thread 3 tries to acquire the lock but is blocked since thread 1 is holding it. Thread 1 finishes working and, before terminating, signals thread 2 that it can reacquire the lock. So what happens then? Will thread 2 or thread 3 acquire the lock next?

Thank you so much for your time and help in advance.

2
AFAIK, when nofity() or notifyAll() is called, there is no provision to specify which waiting thread will obtain the lock. So in your example, Thread 2 or Thread 3 could get the next lock. docs.oracle.com/javase/8/docs/api/java/lang/…anonymous

2 Answers

2
votes

If no priority is given, whoever comes first will acquire the lock.

While mutual exclusion may provide safety property, it does not ensure liveness property. There can be cases where a thread keeps coming first to acquire the lock, resulting in starvation (other threads wait forever because someone keeps occupying).

Google with the keywords highlighted will help you understand more. I found these slides really comprehensive http://www.cs.cornell.edu/Courses/cs414/2004su/slides/05_schedule.pdf

0
votes

If you're using a ReentrantLock (or any of its subclasses), you can pass a "fairness" flag to the constructor. If set to true, this will ensure that control of the lock passes to the longest-waiting thread, in this case your Thread 1.

Lock lock = new ReentrantLock(true);