Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Locking and synchronization between outer and inner class methods?

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/

like image 757
AnkitSablok Avatar asked Sep 20 '13 07:09

AnkitSablok


2 Answers

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)
    {
        // ...
    }
}
like image 72
user207421 Avatar answered Nov 17 '22 13:11

user207421


It will use the this of the immediately enclosing class so the inner class. You can use instead:

public void m() {
    synchronized(OuterClass.this) {
    }
 }
like image 32
assylias Avatar answered Nov 17 '22 14:11

assylias