Locking and synchronization between outer and inner class methods?

后端 未结 3 1068
滥情空心
滥情空心 2020-12-04 01:33

My question is if I have some code like the following -:

public class OuterClass{
   public class InnerClass{
          public synchronized methodA(){ /* doe         


        
相关标签:
3条回答
  • 2020-12-04 02:05

    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`
            // ...
        }
    }
    
    0 讨论(0)
  • 2020-12-04 02:06

    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)
        {
            // ...
        }
    }
    
    0 讨论(0)
  • 2020-12-04 02:14

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

    public void m() {
        synchronized(OuterClass.this) {
        }
     }
    
    0 讨论(0)
提交回复
热议问题