My question is if I have some code like the following -:
public class OuterClass{
public class InnerClass{
public synchronized methodA(){ /* doe
Since you have made the inner class method as synchronized it won't lock the outer class object rather it will only lock the inner class method. To synchronize the outer class as stated earlier it can done as shown below
public void methA()
{
synchronized(OuterClass.this)
{`enter code here`
// ...
}
}
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) {
}
}