My question is if I have some code like the following -:
public class OuterClass{
public class InnerClass{
public synchronized methodA(){ /* does something */}
}
}
now when multiple threads want to call the inner class method will they acquire a lock for the outer class object or for the inner class object and how does one modify the statement so that I synchronize access to the outer class object/
when multiple threads want to call the inner class method will they acquire a lock for the outer class object
No.
or for the inner class object
Yes.
and how does one modify the statement so that I synchronize access to the outer class object/
Add:
synchronized (OuterClass.this)
{
}
inside the method, but note that the inner lock is acquired before the outer lock, as the syntax should now suggest. A consistent locking order is essential to prevent deadlocks. You might prefer to acquire the outer lock first, in which case you should do this:
public void methodA()
{
synchronized(OuterClass.this)
{
synchronized (this)
{
// ...
}
}
}
without a synchronized
declaration on the method itself. Or if you only want the outer lock, do this:
public void methodA()
{
synchronized(OuterClass.this)
{
// ...
}
}
It will use the this
of the immediately enclosing class so the inner class. You can use instead:
public void m() {
synchronized(OuterClass.this) {
}
}
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