I have a class that is similar to this:
public class ExpensiveCalculation {
private Executor threadExecutor = ...
private Object lock = new Object();
private Object data = null;
public Object getData() {
synchronized(lock) {
return data;
}
}
pulic void calculate() {
executor.execute(() -> internalCalculation());
}
private void internalCalculation() {
synchronized(lock) {
// do some long running calculation that in the end updates data
data = new Object();
}
}
}
This class makes some expensive (timewise) calculations and acquires a lock. While the lock is hold no one can retrieve the data that will be updated by the calculation, so in effect they have to wait for the calculation to finish. The actual calculation is done in a separate thread. If I have the following code:
ExpensiveCalculation calculation = ...
calculation.calculate();
Object data = calculation.getData();
The call to retrieve the data is blocked until the calculation is done. What exactly does waiting at this point mean?
I am aware that for this example I could use a Callable
and Future
, but that is beside the point. Is there a way to improve such code, to ensure no time resources are wasted (like unnecessary thread switches)?
The wait function doesn't release "all locks", but it does release the lock associated with the object on which wait is invoked.
"Calling notify() method on an object releases the lock of that object." and later "But when a thread calls notify() method on an object, the thread may not release the lock of that object immediately" in this answer contradict each other.
A lock is acquired via the lock() method and released via the unlock() method. Invoking an unlock() without lock() will throw an exception.
The unlock() method is another most common method which is used for releasing the lock. The unlock() method is a public method that returns nothing and takes no parameter. Syntax: public void unlock()
Is it a busy waiting
No.
Does the waiting thread yield, so other threads (like the one doing the computation) can proceed.
No, it blocks, so that other threads can run.
Does the waiting thread go to sleep?
It is blocked.
Is wait/notify invoked behind the scene?
No.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With