java - Static synchronized methods and non-synchronized static methods confusion -
i have small confusion. please have @ code below.
public class threaddemo {   //non-static synchronized method   synchronized void a(){    actbusy();   }    //static synchronized method   static synchronized void b(){     actbusy();   }    //static method   static void actbusy(){     try{       thread.sleep(1000);     }     catch(interruptedexception e) {       e.printstacktrace();     }   }    public static void main(string[] args){     final threaddemo x = new threaddemo();     final threaddemo y = new threaddemo();     runnable runnable = new runnable() {       public void run() {          int option = (int) (math.random() * 4);          switch (option){            case 0: x.a();              break;            case 1: x.b();              break;            case 2: y.b();              break;            case 3: y.b();              break;          }       }     }   ;     thread t1 = new thread(runnable);     thread t2 = new thread(runnable);     t1.start();     t2.start();   } }   i know sure invocation of sequence possible.
x.a() //in thread-1 y.b() //in thread-2   though still have small confusion that, can see x.a() calls actbusy() method  static method. method b() static synchronized method calling non-synchronized static method. when thread-2 gets class level lock, why call of actbusy() thread-1 not blocked? 
i logically confused, if thread gets class level lock, class other non-synchronized static methods remain open called other methods (instance method). why?
actbusy() not synchronized callers methods are.
so thread 1 not block acquires lock on this object , no other thread holds lock on this, able call without problem.
that because non-static synchronized method locks on this present instance , not on class object.
x.a() grabs lock on present instance i.e x , no other thread able enter method a() of x until present present thread releases lock.
thread 1 --> x.a() //acquires lock , holds it
thread 2 ---> x.a() //blocks here until thread 1 releases lock on x
edit:
class object != instance    so according jmm different objects , 2 threads don't interfere each other. allows call it.
edit 2:
why allow calls other static methods? logic behind it?
suppose this:
public static synchronized int statefulmethod(){     //this should protected }  public static int nonstatefulmethod(){     //just returns static value such 5     //so thread safe not have state }  public static synchronized int otherstatefulmethod(){     //this should thread safe }   so if thread 1 in method statefulmethod() having shared state protect uses class level lock. thread 2 calls nonstatefulmethod() should not logically block method thread safe , there no point in making thread block here.
now if thread 3 calls otherstatefulmethod() while thread 1 holding class lock thread 3 have wait method static-synchornized.
Comments
Post a Comment